自定义的UITableViewCell的UIImageView将不会适应,直到点击
我正在通过斯坦福的cs193p。作业4让我们创建一个自定义的UITableVIewCell,并将网页中的图片加载到单元格内的UIImageView中。自定义的UITableViewCell的UIImageView将不会适应,直到点击
我的UIImageView和我的单元格将其内容模式设置为故事板上的Aspect Fit。并且ImageView在自动布局上设置为拥抱单元格。 然而,当图片第一次加载时,它会流出UIImageView。当我点击它时,它会正确地适应方面。
我试图在分配图像之前在代码中设置内容模式,但那也行不通。我也尝试在分配图像后立即调用layoutSubviews()和setNeedsLayout,虽然这有助于通过实际显示图像(而不是在用户单击单元格之前不显示任何内容),但它仍然以错误的大小显示,直到用户单击它。
这是该小区的代码:
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
}
我很抱歉粘贴所有这些代码,但我不知道问题出在哪里,所以我尽我所能,这可能是相关的。
您应该设置content mode
第一,那么你应该设置你的imageview
的框架,所以一旦你应该尝试设置内容模式的tableview subclass
awakeFromNib
或cellforrowatindexpath
设置图像之前!
或者你可以设置从Interface Builder的内容模式(从情节串连图板!) - >选择您的ImageView - >来回属性检查器 - >(下图)选择模式Aspect fit
我在设置图像后尝试设置,但也没有工作:( –
检查我编辑的答案!我说你应该先设置内容模式,然后再设置视图的框架!!!! – Lion
只需尝试在setForRowAtIndexPath中设置图像之前调用,但该功能无效,它也设置为故事板中的Aspect Fit –
好了,下面就reddit的答案,我删除了表格视图控制器并重新制作它,再次设置所有插座。它的工作原理,我想这是Xcode的一个问题?
因此,如果您遇到类似问题,请尝试重新制作故事板。
我不确定,但我认为在完成获取图像并将其设置在单元格内后,您可能必须重新加载该特定单元格!如果'UIImageView'已经为零,而不是每次调用该函数时都将其设置为零,那么您是不是应该只抓取图像? – Rikh
@Rikh这是教练的职责。我认为这是因为单元格是可重用的,所以你想清除以前调用的内容。通过在分配图像之后调用setNeedsLayout()或layoutSubviews()来重新加载单元格。虽然实际上得到的图像显示(而不是一个空白的屏幕)它不适应正确的大小(方面适合)。 –