2015-11-28 22 views
9

UITableView numaralı telefondan bazı metin ve resimler gösteriyorum. Görüntü ilk indirilir. Resim indirilmeden önce, resmin boyutunu bilmediğimden, başlangıçta bir sabit boyutta UIImageView koydum. Ve görüntü indirildiğinde, UIImageView'u yeniden boyutlandırıyorum.Görüntü yüklemelerinden sonra hücre boyunu güncelleme

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// Download image 

    dispatch_async(dispatch_get_main_queue(), ^{ 

    // UIImageView resizing 
    }); 
}); 

Bütün bunlar cellForRowAtIndexPath olur.
Karşılaştığım sorunlar şunlardır:
1. Hücrenin yüksekliğini nasıl güncelleştiririm? Tek bir hücrede birçok görüntü olabileceğini düşünerek. Bu yüzden, bir indirme işleminin üstündeyken alt resmin konumunu değiştirmem gerekiyor.
2. UITableViewbeginUpdates ve endUpdates kullanmayı denedim, ancak bu, zayıf bir kullanıcı deneyimi sunan hücrenin üstüne kaydırılır.

Bu, UI'nin reloadData üzerinde nasıl göründüğüdür. indirilecek 5 görüntüleri vardır: UI experience after UITableView reloadData

+0

'beginUpdates' ve' endUpdates' aslında bu durumda etkili değildir * Grup içinde reloadData'yi çağırmamalısınız * belgelerin olduğunu belirtir. – vadian

+0

'reloadData' denediniz mi? –

+0

@HarikrishnanT: Evet. Kötü UI deneyimi verir. – Nitish

cevap

11

Kısa Cevap

  • kez dequeueReusableCellWithIdentifier tarafından döndürülen bir UITableViewCell değiştirilmesi estimatedRowHeight
  • için yeterli nefes alan ver, olur önbelleğe hücrelerin
  • Tetik a ile değil eser tek hücre ile yeniden yükleme reloadRowsAtIndexPaths
  • Önbelleğinizi Temel Veriler ile yönetin veizin verinboilerplate kodu, tüm kullanıcı arayüzü işlerini yapabilir. Ayrıntıda

aşağıda

Kod kaydırma olmaz: tazelenmiş olmak hücre veya ufkun altında ise

  1. , UITableView
  2. eğer kaydırma olmaz Yenilenen hücre üstte, UITableView ise
  3. UITableView sadece hücre düz göründüğünde gezinir ve mevcut olandan daha fazla alan gerektirir. Let UITableViewAutomaticDimension

o tetikleyecek şekilde

Sen, hücre bayat olduğunu Cocoa Touch söylemek gerekir zor işi yapmak bir dequeueReusableCellWithIdentifier, bir geri gelme olacak hangi yeni Uygun yükseklikte bir hücresi.
Tüm tablo görünümünü veya bölümlerinden birini yeniden yüklemek kısa bir süreliğine kısadır ve dizinlerinizin kararlı olduğunu kabul ederseniz, -tableView:reloadRows:at:with: dizinini yeni değiştirilen hücrenin indexPath değerini ve .fade animasyonunu geçirerek çağırın.

Kodu:

override func viewDidLoad() { 
    super.viewDidLoad() 
    tableView.estimatedRowHeight = 250 // match your tallest cell 
    tableView.rowHeight = UITableViewAutomaticDimension 
} 

kullanın URLSession. Bir görüntü kullanılabilir hale, yangın reloadRows:at:with:

func loadImage(_ url: URL, indexPath: IndexPath) { 
    let downloadTask:URLSessionDownloadTask = URLSession.shared.downloadTask(with: url, completionHandler: { 
     (location: URL?, response: URLResponse?, error: Error?) -> Void in 
     if let location = location { 
      if let data:Data = try? Data(contentsOf: location) { 
       if let image:UIImage = UIImage(data: data) { 
        self.cachedImages![indexPath.row] = image 
        self.cachedUrls![indexPath.row] = url 
        DispatchQueue.main.async(execute: {() -> Void in 
         self.tableView.beginUpdates() 
         self.tableView.reloadRows(
          at: [indexPath], 
          with: .fade) 
         self.tableView.endUpdates() 
        }) 
       } 
      } 
     } 
    }) 
    downloadTask.resume() 
} 

Örnek: Vikipedi * dan rasgele bir görüntü setini getir * ► GitHub ve ek bu çözüm bulun

Xcode demo

Swift Recipes ile ilgili ayrıntılar.

+0

kullanıyor musunuz Bu durumda heightForRowAtIndex'i çağırmalı mıyım? – Nitish

+0

Hayır. Bağlantılı Xcode projesinde, eski yükseklik hesaplarının hiçbirinin gerekli olmadığını göreceksiniz. AutoLayout ** hepsi ** iş yapar. Büyüleyici. – SwiftArchitect

+0

Eğer haklıysam, otomatik düzen, tablo hücresi kodunda uygulanmadı. Bu, işe yaraması için otomatik mizanpajı kullanarak hücre alt raporları oluşturmam gerektiğini önerir mi? Veya bu gerekli değildir. – Nitish

İlgili konular