自定义的UITableViewCell的UIImageView将不会适应,直到点击

问题描述:

我正在通过斯坦福的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()来重新加载单元格。虽然实际上得到的图像显示(而不是一个空白的屏幕)它不适应正确的大小(方面适合)。 –

您应该设置content mode第一,那么你应该设置你的imageview的框架,所以一旦你应该尝试设置内容模式的tableview subclassawakeFromNibcellforrowatindexpath设置图像之前!

或者你可以设置从Interface Builder的内容模式(从情节串连图板!) - >选择您的ImageView - >来回属性检查器 - >(下图)选择模式Aspect fit

+0

我在设置图像后尝试设置,但也没有工作:( –

+0

检查我编辑的答案!我说你应该先设置内容模式,然后再设置视图的框架!!!! – Lion

+0

只需尝试在setForRowAtIndexPath中设置图像之前调用,但该功能无效,它也设置为故事板中的Aspect Fit –

好了,下面就reddit的答案,我删除了表格视图控制器并重新制作它,再次设置所有插座。它的工作原理,我想这是Xcode的一个问题?

因此,如果您遇到类似问题,请尝试重新制作故事板。