【问题标题】:Prevent UITableViewCell image view from changing size when tapped防止 UITableViewCell 图像视图在点击时改变大小
【发布时间】:2016-04-04 23:45:04
【问题描述】:

我正在尝试使用占位符从远程源将imageView 设置为标准UITableViewCell。无论使用SDWebImageAlamofireImage 作为库,我都会遇到这个问题。

这是单元格在初始加载后的显示方式:

然后,一旦点击/重新加载单元格,它就会显示为:

在情节提要中,我将行高调整为 60 磅,而不是标准的 44 磅。如果我将高度恢复为标准的 44 点,则问题不再存在。

我认为这个问题更多地与单元格的自定义高度有关,而不是与提供占位符的库有关。我在AlamofireImage in case it was a problem with the library 上提出了问题,但事实证明并非如此。

我如何才能将图像初始设置为正确的大小,或防止在重新加载时发生调整大小?

这是来自我的UITableViewCell 子类的代码。请注意,即使我删除了 layoutSubviews 内的框架插入代码,也会出现问题。

class CategoryTableViewCell: UITableViewCell {

    var category: Category! {
        didSet {
            self.updateCategory(category)
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        self.imageView?.frame = CGRectInset(self.imageView!.frame, 10, 10)
    }

    private func updateCategory(category: Category) {
        self.textLabel?.text = category.name

        self.imageView?.sd_setImageWithURL(category.largeImage ?? nil, placeholderImage: UIImage(named: "DefaultCategory"))
    }
}

我现在还在表格视图控制器上设置了以下覆盖,但它没有任何效果。

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 60;
}
    
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 60;
}

【问题讨论】:

  • 你有代码要分享吗?你在用UITableViewCell 子类(如果有的话)做任何“时髦”的事情吗?界面生成器中有任何冲突的约束吗?
  • 尝试将tableview的heightForRowAtIndexPath设置为60。或estimatedHeightForRowAtIndexPath
  • 我已经从我的子类中添加了代码。此外,没有冲突的约束。
  • 我已经添加了如上图所示的两个高度代理,但是它们没有任何效果。
  • @Dwight 我也有同样的问题,你找到解决办法了吗?

标签: ios swift uitableview


【解决方案1】:

我想发表评论,但我没有足够的声誉这样做。因此,“答案”。

我记得之前遇到过这个问题,这是因为我没有在我的 UITableViewCell XIB 上为其设置适当的约束。一旦我将其设置为固定的宽度/高度并将其固定到父视图的边缘,问题就会自行解决。

【讨论】:

  • 是对的。如果这不能解决您的问题,请检查 UIImageView 内容模式。
  • 我的故事板中的表格视图单元格只是一个空的标准UITableViewCell - 我无法对其设置任何约束,因为我没有通过添加任何子视图来更改它。跨度>
  • 我明白了。我在这里的猜测:您正在访问 UITableViewCell 中的默认 imageView ,其中它的帧被设置为只读属性,在这种情况下,它在重绘后设置为默认的 44 点。参考这个链接:stackoverflow.com/questions/18129461/…
  • 另外,@Abdul Yasin 提到了检查内容模式,如果您不想沿着自定义单元格方向向下移动,这也会有所帮助。
  • @rach 我正确理解默认UITableViewCellimageView 仅在标准高度44 点下工作,如果我希望它在60 点上工作,我需要在界面生成器中设计我自己的视图以使其工作?
【解决方案2】:

我正在使用SDWebImage,这篇文章帮助了我SDWebImage fixed width cell images

这里是我的解决方案,只是保存imageView的初始帧,text和detailText,在layoutSubviews()上恢复

class MoreTableViewCell: UITableViewCell {

    var imageFrame: CGRect? = nil
    var textFrame: CGRect? = nil
    var detailTextFrame: CGRect? = nil

    override func layoutSubviews() {
        super.layoutSubviews()
        if imageFrame == nil {
            imageFrame = imageView?.frame
            textFrame = textLabel?.frame
            detailTextFrame = detailTextLabel?.frame
        }

        if imageFrame != nil {
            self.imageView?.frame = imageFrame!
        }

        if textFrame != nil {
            self.textLabel?.frame = textFrame!
        }

        if detailTextFrame != nil {
            self.detailTextLabel?.frame = detailTextFrame!
        }
    }
} 

【讨论】:

  • 天啊,我必须搜索 整个 网络才能找到layoutSubviews 的提示。谢谢!
【解决方案3】:

只需在设置 Cell 的图像视图后添加 cell.setNeedsLayout() 即可!

MenuController.shared.fetchImage(url: item.imageURL) { (image) in
        if let image = image {
            DispatchQueue.main.async {
                cell.imageView?.image = image
                cell.setNeedsLayout()
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    相关资源
    最近更新 更多