繁体   English   中英

自定义UITableViewCell的UIImageView在点击之前不适合

[英]Custom UITableViewCell's UIImageView won't aspect fit until clicked on

我正在经历斯坦福大学的cs193p。 作业4让我们创建了一个自定义UITableVIewCell并将来自网络的图片加载到该单元格内的UIImageView中。

我的UIImageView和Cell在故事板上的内容模式设置为Aspect Fit.ImageView设置为自动布局以拥抱该单元。 但是,当图片第一次加载时,它将从UIImageView中渗出。 当我单击它时,它将正确适合方面。

我只是在分配图像之前尝试在代码中设置内容模式,但这也没有用。 我还尝试在分配图像后立即调用layoutSubviews()和setNeedsLayout,尽管这通过实际显示图像(而不是在用户单击单元格之前不显示任何内容)有所帮助,但在用户单击它之前它仍然显示错误的大小。

这是UIImageView的约束

这是单元格的代码:

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的框架,因此,一旦您尝试在cellforrowatindexpath tableview subclass awakeFromNibcellforrowatindexpath设置content mode ,然后再cellforrowatindexpath进行设置!

或者,您可以从界面构建器(从情节提要!)中设置内容模式->选择图像视图->来回属性检查器->选择模式(在视图下)以Aspect fit

好吧,按照关于reddit的回答,我删除了表格视图控制器并重新制作了它,再次设置了所有插座。 它起作用了,我想这是Xcode中的问题吗?

因此,如果您遇到这样的问题,请尝试重新制作情节提要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM