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
}

これは問題なく機能しますが、多くのレコードではメモリに問題があると思います-ユーザーがテーブルをスクロールしたときにセルが2つしかない場合でも-各マップは即座にロードされ、それを行うのにどれだけの計算能力が必要か想像できますそれで。

私の質問は、動的マップ ビューをマップの実際の位置のスクリーンショットのようなものに変更する方法はありますか? 細胞数が多いほど速くなりますか?

4

1 に答える 1

2

はい、可能です。そのためには、UIImageView (mapImageView以下のコードで呼び出されます) と MKMapSnapshotter の使用に切り替える必要があります。物事を実際に飛ばすには、MKMapSnapshotter が生成する画像をキャッシュして、ユーザーが以前に表示されたセルにスクロールして戻ったときにすぐに読み込まれるようにする必要があります。このアプローチは、各セルのマップではなく、1 つのグローバル MKMapSnapShotter のみを使用するため、リソースに優しいです。

あなたの状況に合わせたコードを次に示します。アプリでキャッシュをどのように処理するかによって異なるため、キャッシュの具体的な方法については詳しく説明しませんでした。過去にhttps://cocoapods.org/pods/Hanekeの 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 に答える