6

在我的 iosswift应用程序中,我有一个UITableViewController动态添加的单元格。每个单元格都有一个MKMapView嵌入的,我正在为不同坐标上的每个单元格设置地图的中心。我通过调用这个方法来做到这一点:

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

里面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
}

这很好,它可以工作,但我想有很多记录会有内存问题 - 即使现在用户滚动表格时只有几个单元格 - 每个地图都会立即加载,我只能想象需要多少计算能力来做所以。

所以我的问题是 - 有没有办法将动态地图视图更改为某种可能是地图实际位置的屏幕截图?当涉及到大量细胞时,它会更快地工作吗?

4

1 回答 1

2

对的,这是可能的。为此,您应该切换到使用 UIImageView(mapImageView在下面的代码中调用)和 MKMapSnapshotter。为了让事情真正飞起来,您应该缓存 MKMapSnapshotter 生成的图像,以便在用户滚动回之前看到的单元格时立即加载它们。这种方法对资源很温和,因为它只使用一个全局 MKMapSnapShotter 而不是每个单元格的地图。

这是我根据您的情况调整的一些代码。我没有具体介绍如何缓存的细节,因为这取决于您希望如何处理应用程序中的缓存。我过去使用过 Haneke cocoapod:https ://cocoapods.org/pods/Haneke 。此外,我在下面设置了许多常见的快照选项,但您可能应该根据您的用例调整它们。

//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
                    }
                })
于 2016-06-08T15:54:01.143 回答