【问题标题】:Autolayout UITableView expand parent view but not greater than safe areaAutolayout UITableView 展开父视图但不大于安全区域
【发布时间】:2019-08-25 08:47:03
【问题描述】:

我有一个 Storyboard,它有一个简单的视图层次结构:

- View (has top/bottom constraints relative to safeArea >= 30, centerY)
   - Label (has height/top(SuperView)/bottom(TextField) constraints)
   - TextField (has height/top(Label)/bottom(TableView) constraints)
   - TableView (has height >= 0, top(TextField)/bottom(Superview) constraints)

在 UITableViewDelegate (cellForRowAt) 内部:

tableView.setNeedsLayout()
tableView.layoutIfNeeded()

我希望实现的行为是让 TableView 和父视图随着新记录的添加而增长。但是,父视图不应超过其相对于安全区域的顶部/底部约束。

所有元素都明确设置了高度约束和间距,除了表格视图(高度 >= 0)。同样,父视图内容拥抱优先级为 250,tableview 压缩阻力为 750。我认为修复高度约束和元素之间的间距将使 tableview 增长到某个点,因为顶部的内容压缩阻力更高/bottom 安全区域的限制比 TableView 的限制。

但是,XCode 迫使我为父视图设置高度或 Y 位置约束。我不能这样做,因为那样视图就不能自动增长。

我更愿意坚持使用 AutoLayout,并想知道是否有人对如何做到这一点有想法或资源。

【问题讨论】:

    标签: ios swift uitableview autolayout


    【解决方案1】:

    表格视图不会根据行数自动设置高度。

    您可以使用这个自定义表格视图类(来自https://stackoverflow.com/a/48623673/6257435):

    final class ContentSizedTableView: UITableView {
        override var contentSize:CGSize {
            didSet {
                invalidateIntrinsicContentSize()
            }
        }
    
        override var intrinsicContentSize: CGSize {
            layoutIfNeeded()
            return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
        }
    }
    

    每当内容大小发生变化时,这将“自动调整”您的表格视图。要使用它,请添加一个表格视图并将其类设置为ContentSizedTableView

    • 根据需要限制顶部、前导和尾随。
    • 将底部限制为 >= 0 到超级视图的底部(或 >= 8,如果您希望它从底部停止 8 点,或者您想要的布局的任何值)。
    • 给它一个高度限制——实际上并不重要,但是使用像100 这样的值让你在使用布局时看到它。
    • 然后编辑高度限制并选中Placeholder - Remove at build time复选框。

    当你运行应用程序时,表格视图的高度约束将被移除,ContentSizedTableView 将自动增长,直到达到底部约束。

    【讨论】:

    • 谢谢,这很好用。当表格视图大小增加时,有没有办法让父视图扩展?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多