ios - 以编程方式增加 TableView 行中自定义 View 的高度(结果也是该行的高度)

标签 ios swift uitableview uiview autolayout

我有一个 View (后来称为自定义 View ),它在其中呈现 subview 。将它们渲染出来后,我得到一个新的所需高度值(因此所有 subview 都可见)并尝试更新 View 的高度。这是从 UITableViewCell 的子类的 awakeFromNib() 方法调用的代码(注意:ReactiveSwift 在下面的代码中使用):

customView.model.requiredHeight.producer
        .observe(on: UIScheduler())
        .skipNil()
        .skipRepeats()
        .startWithValues { [weak self] in
            print("increased Height: ", $0)

            self?.customViewHeightConstraint.constant += $0

            print("customView height: ", self?.customView.frame)
    }

因此,要添加到约束中的正确高度已被抓取,第一个打印语句确认了这一点。但是,这不会改变 View 的外观。最后的打印语句显示,即使我将值添加到 View 的高度约束,它的框架也是一样的。

我需要指出的是,这个所谓的自定义 View 位于 UITableView 的行内。这是布局(绿色矩形是单元格,黄色是 UILabel,红色是 View ):

enter image description here

因此,所有内容都固定在边缘。我为该行使用自动行高(但是,如果我将其设置为自定义则没有区别)并在 TableView 委托(delegate)的 tableView(_:estimatedHeightForRowAt:) 方法中返回 UITableView.automaticDimension 作为估计高度。

老实说,我确定我遗漏了一些明显但无法弄清楚的东西。如果自定义 View 不在单元格内,则此技术非常有效,所以我认为,这与表格 View 单元格有关。

最佳答案

你做的一切都是对的,你的约束也是正确的,但是 TableView 还没有听说它们已经改变的事实。您需要重新加载 TableView (或至少这一行)。

顺便说一句,最好的方法是执行一个空的批量更新,因为这会导致约束的变化动画化,这是一个非常漂亮的外观。

编辑: 我说“您的约束是正确的”,但您后来添加的评论表明这不是真的。听起来您正在尝试将固定布局与自动布局“混合搭配”:您的自定义 View 使用自动布局,但其 subview 不使用。不要那样做。

与其手动更改自定义 View 的高度约束,不如在内部对所有 subview 使用约束,以便它们的约束从内到外调整自定义 View 的大小——与单元格本身的工作方式完全相同。或者,您应该关闭单元格的自动调整大小并实现 heightForRowAt手动指定整个单元格的高度。

关于ios - 以编程方式增加 TableView 行中自定义 View 的高度(结果也是该行的高度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354747/

相关文章:

ios - facebook 集成登录问题 canOpenURL : failed for URL: "fbauth2:/" - error: "(null)"

ios - 照片库中的视频图 block

ios - 如何使用 UISearchController 去除 UINavigationBar 下方的阴影

ios - 引用同一变量时,Swift 数组内存地址发生变化

ios - iOS 7上UITableView行删除动画闪烁

ios - JSON 到 UITableView 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序

ios - 如何将文件添加到项目并引用它?

ios - Swift 类型推断需要问号或感叹号

ios - 点击按钮时显示 UIPickerView

ios - 检测 tableView reloadData 完成的新解决方案?