5

ios swift uygulamasında, dinamik olarak eklenen hücrelerle UITableViewController var. Her bir hücrenin gömülü olduğu MKMapView vardır ve her hücre için haritanın ortasını farklı koordinatlarda ayarlıyorum.UITableViewController'daki her hücrede katıştırılmış bir harita var. Bunun yerine haritanın ekran görüntülerine değiştirmenin bir yolu var mı?

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 iç: Bu yöntem çağırarak bunu yapıyorum

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 
} 

Bu gayet iyi ve çalışır, ancak ben bellek ile problem olacak kayıtların sürü hayal - şimdi bile kullanıcı tabloyu kaydırdığında sadece çift hücrelerle birlikte - her harita anında yüklenir ve bunu yapmanın ne kadar güç olduğunu tahmin edebilirim.

Benim sorum şu: dinamik harita görüntüsünü, haritanın gerçek konumunun bir tür ekran görüntüsüne dönüştürmenin bir yolu var mı? Çok sayıda hücreye geldiğinde daha hızlı çalışacak mı?

cevap

2

Evet, bu mümkün. Bunu yapmak için, UIImageView (aşağıdaki kodda mapImageView olarak adlandırılır) ve MKMapSnapshotter kullanmaya geçmelisiniz. Bir şeyi gerçekten uçurmak için, MKMapSnapshotter'ın ürettiği görüntüleri, bir kullanıcı daha önce görülen bir hücreye geri döndüğünde anında yüklenecek şekilde önbelleğe almalısınız. Bu yaklaşım, her hücrenin bir haritasından ziyade sadece bir global MKMapSnapShotter kullandığı için, kaynaklarda hassastır.

Durumunuza uyarladığım bazı kodlar. Özel olarak önbelleğe alma işleminin ayrıntılarını eklemedim, çünkü bu, uygulamanızda önbelleğe alma işlemlerini nasıl ele almak istediğinize bağlı. Haneke cocoapod: https://cocoapods.org/pods/Haneke geçmişte kullandım. Ayrıca, aşağıdaki genel ortak özelliklerden birçoğunu ayarlamıştım, ancak muhtemelen bunları kullanım durumunuza uyarlamalısınız.

//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 
        } 
       })