具有基于宽度的固有高度的 UITableViewCell

问题描述

所以我制作了自定义视图 ExpressionView 来可视化数学表达式。表达式的每一部分都是 UILabel 保存一个数字或操作,并且标签在 ExpressionView 内以右对齐的行对齐。我希望 ExpressionView 的宽度由外部的自动布局约束定义,但高度应该是内在的,具体取决于我必须为给定宽度制作多少行标签。

对齐方法效果很好,我使用每个标签的 frame.size 和 ExpressionView 的宽度,进行数学运算,设置标签的框架位置,并计算包含所有行所需的高度。我还定义了这些,以便在每次 ExpressionLabel 宽度更改时设置固有大小和重新布局标签:

        override var intrinsicContentSize: CGSize {
            let res = CGSize(width: UIView.noIntrinsicMetric,height: CGFloat(self.contentHeight) //counted during self.layoutAllLabels()
            )

            return res
       }
       
        public override func layoutSubviews() {
            super.layoutSubviews() //finish layout to get current label sizes and self width 
            let preHeight = self.contentHeight
            self.layoutAllLabels() //layout all labels in current width,count required height
    
            //if required height changed,relayout everything
            if (preHeight != self.contentHeight) {
                self.invalidateIntrinsicContentSize()
                self.superview?.setNeedsLayout()
                self.superview?.layoutIfNeeded()
            }
        }

当 ExpressionLabel 通过普通 UIView 中的自动布局约束设置到位时,一切正常。但是当 ExpressionLabel 固定在 UITableViewCell 的 contentView 中时它会失败,我希望它定义单元格的高度。我的 UITableView 具有自动调整单元格大小所需的这些行

        self.estimatedRowHeight = 50
        self.rowHeight = UITableView.automaticDimension

单个单元格的大小以某种方式发生并且通常是正确的,但通常也会给出无效的高度。它可能与单元重用有关(通过 dequeueReusableCells()),因为旧的高度可能保留在重用的单元中。但是为什么它们没有更新,什么时候它们应该在任何 ExpressionView.layoutSubviews() 调用中更新?在 UITableView 中创建时单元格是否不会自动布局?如果没有,在哪里进行标签布局,以便即使在 UITableView 中也能正确更新?当我知道最终的单元格宽度,并且可以根据它调整其子视图的固有高度时?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)