gpt4 book ai didi

ios - 在 ScrollView 内更新 subview 的高度(没有滚动的 UITableView)后 UIStackView 不更新

转载 作者:可可西里 更新时间:2023-11-01 03:53:26 26 4
gpt4 key购买 nike

当 stackView 位于 ScrollView 中时,如何使 UIStackView 重新分配它的子 UITableViews

我的布局层次结构是基于苹果官方文档关于 Dynamic content for StackViews

 - UISCrollView
- UIStackView
- UIView A
- UIView B
- UIView C
- UITableView X
- UITableView Y
- UIView D

约束已按文档设置。 StackView 的初始布局是正确的,显示了所有可见的 subview 。当强制常规 View 扩展到屏幕高度之外时,滚动会按预期工作。此外,在 Storyboard中查看布局时,一切都按预期堆叠。
此时 UITableView 是空的。只要我向 tableView 添加内容,问题就会出现。

问题
当我通过调用 .reloadData() 动态更新 TableView 时,我看到它们的内容出现了。 (thanks to this answer 关于非滚动 tableView)但是 UIStackView 没有堆叠 UITableView。

  • UIView D 堆叠在 UIView C
  • 下方
  • UITableView XUITableView Y 也堆叠在 UIView B 下方

我的猜测是我需要使 stackview 无效,或者以某种方式让它重新分配它的 subview 。我该怎么做?

enter image description here

最佳答案

首先,一个警告:

您要实现的并不是真正标准的 iOS 行为。您应该首先考虑一种不同的方法,例如创建具有多个部分的单个分组 TableView 。您可以在表格 View 中将自定义 View 实现为部分页眉或页脚。


现在,如果您真的想采用原来的方法...

...出于某些重要原因,您应该知道 TableView 在默认情况下没有固有的内容大小。因此,您需要告诉 TableView 它应该有多高,否则它只会缩小到零高度。

您可以通过继承 UITableView 并覆盖其 intrinsicContentSize() 来实现这一点,正如 Rob 在 this answer 中所建议的那样类似的问题。

或者您为每个 TableView 添加一个高度约束并在代码中动态设置它们的常量。一个简单的例子:

  1. 将您的两个 TableView 添加到 Interface Builder 中的垂直堆栈 View 。
  2. 为两个 TableView 提供前导和尾随约束,以将它们的左右边缘固定到堆栈 View 。
  3. 在各自的 View Controller 中为您的 TableView 创建导出:

    @IBOutlet weak var tableView1: UITableView!
    @IBOutlet weak var tableView2: UITableView!

    @IBOutlet weak var tableView1HeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var tableView2HeightConstraint: NSLayoutConstraint!
  4. 覆盖该 View Controller 的 updateViewConstraints() 方法:

    override func updateViewConstraints() {
    super.updateViewConstraints()
    tableView1HeightConstraint.constant = tableView1.contentSize.height
    tableView2HeightConstraint.constant = tableView2.contentSize.height
    }
  5. 现在,每当您的任何 TableView 的内容发生变化时(例如,当您添加或删除行或更改单元格内容时),您需要告诉您的 View Controller 它需要更新其约束。假设您有一个按钮,每次点击它都会向 tableView1 添加一个单元格。您可以像这样实现它的操作:

    @IBAction func buttonTappen(sender: AnyObject) {
    // custom method you implement somewhere else in your view controller
    addRowToTableView1DataSource()
    // reload table view with the updated data source
    tableView1.reloadData()
    // triggers an updateViewConstraints() call
    view.setNeedsUpdateConstraints()
    }

tl;博士:

UITableView 不适用于未启用滚动的情况,因此您始终需要在其内容更改时明确设置其高度 - 可能是使用约束或通过覆盖 TableView 的固有内容大小.

关于ios - 在 ScrollView 内更新 subview 的高度(没有滚动的 UITableView)后 UIStackView 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com