2016-12-29 76 views
0

我正在通過斯坦福的cs193p。作業4讓我們創建一個自定義的UITableVIewCell,並將網頁中的圖片加載到單元格內的UIImageView中。自定義的UITableViewCell的UIImageView將不會適應,直到點擊

我的UIImageView和我的單元格將其內容模式設置爲故事板上的Aspect Fit。並且ImageView在自動佈局上設置爲擁抱單元格。 然而,當圖片第一次加載時,它會流出UIImageView。當我點擊它時,它會正確地適應方面。

我試圖在分配圖像之前在代碼中設置內容模式,但那也行不通。我也嘗試在分配圖像後立即調用layoutSubviews()和setNeedsLayout,雖然這有助於通過實際顯示圖像(而不是在用戶單擊單元格之前不顯示任何內容),但它仍然以錯誤的大小顯示,直到用戶單擊它。

This is the UIImageView's constraints

這是該小區的代碼:

import UIKit 


class ImageTableViewCell: UITableViewCell { 
    @IBOutlet weak var pictureView: UIImageView! 

    var pictureURL: URL? { 
     didSet { 
      fetchImage() 
     } 
    } 

    fileprivate func fetchImage() { 
     if let url = pictureURL { 
      pictureView.image = nil 
      let queue = DispatchQueue(label: "image fetcher", qos: .userInitiated) 
      queue.async { [weak weakSelf = self] in 
       do { 
        let contentsOfURL = try Data(contentsOf: url) 

        DispatchQueue.main.async { 
         if url == self.pictureURL { 
          weakSelf?.pictureView?.image = UIImage(data: contentsOfURL) 
          weakSelf?.layoutSubviews() 
          print("loaded") 
         } 
        } 
       } catch let exception { 
        print(exception.localizedDescription) 
       } 
      } 
     } 
    } 
} 

這是加載在其TableViewController細胞代碼:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var cell = UITableViewCell() 
     switch indexPath.section { 
     case 0: 
      cell = tableView.dequeueReusableCell(withIdentifier: "imageCell", for: indexPath) 
      if let imageCell = cell as? ImageTableViewCell { 
       imageCell.pictureURL = tweet?.media[indexPath.row].url 
     // other stuff not programmed yet 
     } 
     return cell 

,讓我在小區的代碼身高:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if indexPath.row == 0 && tweet != nil { 
      let media = tweet?.media[indexPath.row] 
      return tableView.frame.width/CGFloat(media!.aspectRatio) 
     } 
     return UITableViewAutomaticDimension 
    } 

我很抱歉粘貼所有這些代碼,但我不知道問題出在哪裏,所以我盡我所能,這可能是相關的。

+0

我不確定,但我認爲在完成獲取圖像並將其設置在單元格內後,您可能必須重新加載該特定單元格!如果'UIImageView'已經爲零,而不是每次調用該函數時都將其設置爲零,那麼您是不是應該只抓取圖像? – Rikh

+0

@Rikh這是教練的職責。我認爲這是因爲單元格是可重用的,所以你想清除以前調用的內容。通過在分配圖像之後調用setNeedsLayout()或layoutSubviews()來重新加載單元格。雖然實際上得到的圖像顯示(而不是一個空白的屏幕)它不適應正確的大小(方面適合)。 –

回答

0

您應該設置content mode第一,那麼你應該設置你的imageview的框架,所以一旦你應該嘗試設置內容模式的tableview subclassawakeFromNibcellforrowatindexpath設置圖像之前!

或者你可以設置從Interface Builder的內容模式(從情節串連圖板!) - >選擇您的ImageView - >來回屬性檢查器 - >(下圖)選擇模式Aspect fit

+0

我在設置圖像後嘗試設置,但也沒有工作:( –

+0

檢查我編輯的答案!我說你應該先設置內容模式,然後再設置視圖的框架!!!! – Lion

+0

只需嘗試在setForRowAtIndexPath中設置圖像之前調用,但該功能無效,它也設置爲故事板中的Aspect Fit –

0

好了,下面就reddit的答案,我刪除了表格視圖控制器並重新制作它,再次設置所有插座。它的工作原理,我想這是Xcode的一個問題?

因此,如果您遇到類似問題,請嘗試重新制作故事板。

相關問題