2015-11-28 52 views
9

我在UITableView中顯示了一些文本和圖像。圖像首先被下載。由於圖像下載之前,我不知道圖像的大小,所以我最初把一些固定大小的UIImageView。當圖像下載時,我調整了UIImageView圖像下載後更新單元格高度

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// Download image 

    dispatch_async(dispatch_get_main_queue(), ^{ 

    // UIImageView resizing 
    }); 
}); 

所有這些發生在cellForRowAtIndexPath
我在這裏面臨的問題是:
1.如何更新單元格的高度?考慮到在一個單元中可以有許多圖像。所以我需要在一次下載時更改底部圖像的位置。
2.我嘗試使用UITableViewbeginUpdatesendUpdates,但滾動到細胞的頂部給用戶提供了不好的體驗。

這就是UI在reloadData上的樣子。有5張圖片被下載:UI experience after UITableView reloadData

+0

'beginUpdates'和'endUpdates'在這種情況下實際上是無效的*你不應該在組中調用reloadData *說明文檔。 – vadian

+0

試過'reloadData'? –

+0

@HarikrishnanT:是的。給糟糕的UI體驗。 – Nitish

回答

11

簡答

  • 提供足夠的喘息空間來estimatedRowHeight
  • 更改一旦被dequeueReusableCellWithIdentifier返回UITableViewCell使用緩存的細胞
  • 觸發工作單元重新加載reloadRowsAtIndexPaths
  • 使用Core Data管理您的緩存並讓NSFetchedResultsController樣板代碼可以做所有的UI工作。

在下文中詳細

代碼不會滾動:

  1. 如果電池被刷新等於或低於地平線,該UITableView不會滾動
  2. 如果正在刷新的單元格位於頂部之上,UITableView將不會滾動
  3. UITableView只能在單元看得見時纔會滾動,並且需要比可用空間更多的空間。

UITableViewAutomaticDimension做的辛勤工作

你需要告訴可可觸摸小區是陳舊,這樣就會引發dequeueReusableCellWithIdentifier,到你要回一個單元與適當的高度。
無法重新加載整個表視圖或其中一個節,並且假設索引穩定,請調用-tableView:reloadRows:at:with:傳遞剛剛更改的單元格的indexPath和.fade動畫。

代碼:

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

使用URLSession。當圖像變爲可用,火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() 
} 

示例:*維基百科獲取隨機的一組圖片*

Xcode demo

►查找GitHub和額外的這個解決方案有關Swift Recipes的詳細信息。

+0

在這種情況下,我需要調用heightForRowAtIndex? – Nitish

+0

不會。您將在鏈接的Xcode項目中看到,遺留高度計算不是必需的。 AutoLayout可以完成所有工作。它很神奇。 – SwiftArchitect

+0

如果我是對的,自動佈局尚未在表格單元的代碼中實現。這是否表明,我需要使用自動佈局創建單元格子視圖以使其工作?或者那不是必需的。 – Nitish

相關問題