iOS 11 中 UITableViewCell 内的 UIImageView 的固定大小

Posted

技术标签:

【中文标题】iOS 11 中 UITableViewCell 内的 UIImageView 的固定大小【英文标题】:Fixed Size for UIImageView Inside UITableViewCell in iOS 11 【发布时间】:2017-09-23 14:02:36 【问题描述】:

我正在使用 UIImageView、titleLabel 和描述标签附带的默认 UITableViewCell。我想为我的 UIImageView 设置一个固定大小,以便所有图像都具有相同的大小。目前看起来是这样的:

单元格的行高是“自动”,这里是 UITableView 的属性。

如何让我的 UIImageView 固定大小?

图片是异步下载的,如下图:

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let dish = self.dishes[indexPath.row]
        cell.textLabel?.text = dish.title
        cell.imageView?.image = UIImage(named: "placeholder")

        cell.detailTextLabel?.text = dish.description

        cell.imageView?.setImageFor(url: URL(string: dish.imageURL)!)  image in
            cell.imageView?.image = image
            cell.imageView?.translatesAutoresizingMaskIntoConstraints = false
            cell.imageView?.widthAnchor.constraint(equalToConstant: 50)
            cell.imageView?.heightAnchor.constraint(equalToConstant: 50)
            cell.setNeedsLayout()
        

        return cell

    

UIImageView+Additions.swift

func setImageFor(url :URL, completion: @escaping (UIImage) -> ()) 

        DispatchQueue.global().async 

            let data = try? Data(contentsOf: url)

            if let data = data 

                let image = UIImage(data: data)

                DispatchQueue.main.async 

                    completion(image!)

                
            
        
    

【问题讨论】:

尝试设置imageView.contentMode = .scaleAspectFit 我做了它什么也没做! 【参考方案1】:

您正在尝试在您的completion block handler 中更改您的UIImageViewheight anchorwidth anchor。您不应该这样做,如果需要,请确保您正在更新 main thread 中的布局。

您的UIImageViewtop, bottom, leading, and trailing anchor 可能等于superView,在您的情况下,它是tableViewCell,并且您的UITableViewCells 具有自动高度。这些导致您的UIImageView 大小不等。

由于您使用的是界面生成器,请尝试像这样布局您的UIImageView

如您所见,我的UIImageView 具有固定的宽度和高度。

最后,别忘了设置UIImageViewcontentMode 并将clipToBounds 勾选为是。

【讨论】:

谢谢! imageView.image 设置在主线程内。我已经粘贴了 setImageURL 的代码。出于某种原因,我无法对 UIImageView 设置任何约束,如图所示。一次,我再次使用默认 UITableViewCell 而不是创建原型单元格。也许这是 Xcode 9 中的一个错误。 你可以:)。单击您的 TableViewCell 并将其 style 设置为自定义。试试看。 如果我自定义样式,那么我无法设置任何东西!没关系。我将创建一个自定义原型单元并使用它。 这取决于你。只是不要忘记将您的自定义 UITableViewCell 注册到您的 UITableView 并选择一个有用的答案:) 我已经完成了所有设置,但仍然在苦苦挣扎。由于我的图像具有垂直方向,因此尽管有固定的高度限制,它总是扩展到单元格的高度。 clipToBounds 成功了!

以上是关于iOS 11 中 UITableViewCell 内的 UIImageView 的固定大小的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 中的 UITableViewCell 转换中断

自动滚动到放置在 UITableViewCell 内的 textView 光标在 iOS11 中不起作用

UITableViewCell Autolayout问题(iOS 11,Xcode 9.2)

UITableViewCell.textLable.text 没有出现在 xcode 9.2 的 iOS11.2 模拟器上

iOS:自定义UITableViewCell的实现需要调用super

iOS7 手机应用中的通话、邮件等图标放入UITableViewCell