5

Trong ứng dụng ios swift của tôi, tôi có UITableViewController với các ô được thêm động. Mỗi ô được nhúng MKMapView và tôi đặt trung tâm của bản đồ cho mỗi ô trên các tọa độ khác nhau. Tôi làm như vậy bằng cách gọi phương pháp này:Trong mỗi ô trong UITableViewController tôi đã nhúng bản đồ. Có cách nào thay đổi nó thành ảnh chụp màn hình bản đồ thay thế không?

func centerMapOnLocation(location: CLLocation, map: MKMapView, radius: CLLocationDistance) { 
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 
     radius * 2.0, radius * 2.0) 
    map.setRegion(coordinateRegion, animated: true) 
} 

bên cellForRowAtIndexPath:

override func tableView(tview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tview.dequeueReusableCellWithIdentifier("cell") as! SingleCall 
    let user:SingleUser = self.items[indexPath.row] as! SingleUser 

    let regionRadius: CLLocationDistance = 150 
    let initialLocation = CLLocation(latitude: user.coordinate.latitude, longitude: user.coordinate.longitude) 

    centerMapOnLocation(initialLocation, map: cell.eventMap, radius: regionRadius) 

    cell.eventMap.zoomEnabled = false 
    cell.eventMap.scrollEnabled = false 
    cell.eventMap.userInteractionEnabled = false 
} 

Điều này là tốt và nó hoạt động, nhưng tôi tưởng tượng với rất nhiều hồ sơ sẽ có vấn đề với bộ nhớ - ngay cả bây giờ chỉ với vài ô khi người dùng cuộn bảng - mỗi bản đồ tải ngay lập tức và tôi chỉ có thể hình dung được sức mạnh tính toán cần thiết để làm như vậy.

Vì vậy, câu hỏi của tôi là - có cách nào để thay đổi chế độ xem bản đồ động thành một số loại có thể ảnh chụp màn hình về vị trí thực tế của bản đồ không? Nó sẽ hoạt động nhanh hơn khi nói đến rất nhiều tế bào?

Trả lời

2

Có, điều đó là có thể. Để làm như vậy, bạn nên chuyển sang sử dụng UIImageView (được gọi là mapImageView trong mã bên dưới) và MKMapSnapshotter. Để làm cho mọi thứ thực sự bay, bạn nên lưu trữ những hình ảnh mà MKMapSnapshotter tạo ra để chúng tải ngay lập tức khi người dùng cuộn trở lại một ô được xem trước đó. Cách tiếp cận này là nhẹ nhàng trên các nguồn lực vì nó chỉ sử dụng một MKMapSnapShotter toàn cầu chứ không phải là một bản đồ cho mỗi ô.

Dưới đây là một số mã mà tôi đã thích nghi với hoàn cảnh của bạn. Tôi chưa bao gồm chi tiết về cách cache cụ thể, vì điều đó phụ thuộc vào cách bạn muốn xử lý bộ nhớ đệm trong ứng dụng của mình. Tôi đã sử dụng các cocoapod Haneke: https://cocoapods.org/pods/Haneke trong quá khứ. Ngoài ra, tôi đã đặt nhiều tùy chọn snapshotted phổ biến bên dưới, nhưng bạn có lẽ nên thích nghi chúng với trường hợp sử dụng của bạn.

//CHECK FOR CACHED MAP, IF NOT THEN GENERATE A NEW MAP SNAPSHOT  
let coord = CLLocationCoordinate2D(latitude: placeLatitude, longitude: placeLongitude) 
       let snapshotterOptions = MKMapSnapshotOptions() 
       snapshotterOptions.scale = UIScreen.mainScreen().scale 
       let squareDimension = cell.bounds.width < cell.bounds.height ? (cell.bounds.width)! : (cell.bounds.height)! 
       snapshotterOptions.size = CGSize(width: squareDimension, height: squareDimension) 
       snapshotterOptions.mapType = MKMapType.Hybrid 
       snapshotterOptions.showsBuildings = true 
       snapshotterOptions.showsPointsOfInterest = true 
       snapshotterOptions.region = MKCoordinateRegionMakeWithDistance(coord, 5000, 5000) 

let snapper = MKMapSnapshotter(options: snapshotterOptions) 

       snapper.startWithCompletionHandler({ (snap, error) in 
        if(error != nil) { 
         print("error: " + error!.localizedDescription) 
         return 
        } 
        dispatch_async(dispatch_get_main_queue()) { 
         guard let snap = snap where error == nil else { return } 

         if let indexPaths = self.tview.indexPathsForVisibleRows { 
          if indexPaths.contains(indexPath) { 
           cell.mapImageView.image = snap 
          } 
         } 
         //SET CACHE HERE 
        } 
       }) 
Các vấn đề liên quan