gpt4 book ai didi

ios - 除非我添加另一个 UIView,否则 ScrollView 中的 TableView 为空?

转载 作者:行者123 更新时间:2023-11-30 11:06:57 25 4
gpt4 key购买 nike

我有一个 ViewController,里面有一个 ScrollView(固定到边缘,4 个约束)。一切都很好。

然后,我将 TableViewController 作为 ChildViewController 添加到 ScrollView。 TableViewController 被硬编码为 3 行。 TableViewController 的 View 固定到完整的 ScrollView。

@IBOutlet weak var SV: UIScrollView!

override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let TVC = storyboard.instantiateViewController(withIdentifier: "TVC") as! TVC

addChildViewController(TVC)
SV.addSubview(TVC.view)
TVC.didMove(toParentViewController: self)

TVC.view.translatesAutoresizingMaskIntoConstraints = false
TVC.view.topAnchor.constraint(equalTo: SV.topAnchor).isActive = true
TVC.view.leadingAnchor.constraint(equalTo: SV.leadingAnchor, constant: 100).isActive = true
TVC.view.trailingAnchor.constraint(equalTo: SV.trailingAnchor, constant: -100).isActive = true
TVC.view.bottomAnchor.constraint(equalTo: SV.bottomAnchor).isActive = true
}

如果我打开调试器,我会看到 ScrollView 布局不明确,并且 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell永远不会被调用 TableView Controller (为什么?)。

相反,如果我只是在 Storyboard或任何其他 View 中、 ScrollView 内添加一个标签,并向其添加 4 个约束,那么将显示 TableView 和 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell按预期调用。

这是怎么回事? ScrollView 不应该含糊不清,因为 TableView 应该计算它自己的内在内容大小?如果 tableview 单独位于 ScrollView 内,则它永远不会填充自己,这有什么问题?

我正在添加整个示例项目。如果运行它,则会显示预期结果,即显示表格 View 。如果您转到 Storyboard 并从 ScrollView 中删除标签,则根本不会填充 TableView。

我不知道如何在这里直接添加示例项目,所以我上传了它。只需运行它,然后从 Storyboard 中删除唯一的标签并重新运行它,就不再有表格 View 。 https://wetransfer.com/downloads/e0a75a995992cdc2be9120224515549920181003074547/1083bc9a3cb34fe9b1ab8e513b1520f020181003074547/e68826

PS:忽略其他东西,比如其中的 subview Controller 。我唯一的问题是为什么当标签存在于同一个 ScrollView 中时会显示 tableview,而当标签被删除时则不会显示。

最佳答案

首先,应用于 ScrollView 内 View 的约束有点特殊。它们没有链接到 ScrollView 的框架,而是链接到 ScrollView 的“contentSize”。通常,如果您在另一个 View 中有一个 View ,并且内部 View 在所有方向上固定到 super View ,则它将拉伸(stretch)以匹配父级大小(如果父级约束已明确定义为不同的父级),或者如果父级约束没有相对于另一个父级定义,父级将“包装”子级尺寸。

现在,ScrollView 在这种情况下的行为有点不同,ScrollView 大小永远不会“包裹”子项。添加子约束只是为了告诉 ScrollView,滚动区域(contentSize)是多少。

此外,在您的情况下,UITableView,您可以将其视为“特殊”ScrollView,无法为 ScrollView 提供足够的信息来计算可滚动内容。如果您将 tableView 固定在各个方向上,它只会告诉 TableView“在各个方向上与父级对齐”,但 ScrollView 不会知道“我可以滚动多少”。

因此,由于上述问题,您通常会在 ScrollView 内部添加一个 UIView 作为“容器”,并根据滚动方向,将 View 宽度/高度设置为等于 ScrollView 或 ScrollView 的父级 ScrollView (同样取决于用例)。然后,您想要在 ScrollView 中添加的所有内容都将添加到 UIView 中。此外,内容以这样的方式固定,它不允许“压缩”来强制父 View (又名容器)拉伸(stretch)以“包裹”整个内容,这样,滚动就会知道滚动了多少面积。

ScrollView shouldn't be ambiguous, because the TableView should calculate it's own intrinsic content size ?

这是错误的,内在内容大小定义了绘制 View 所需的最小大小。现在想一下,一个tableView需要多少空间才能绘制,如果没有添加其他特殊实现,答案是0。tableView的宽度/高度可以为0,没有任何约束可以阻止这种情况。

现在总结一下,您的实现有点错误,要修复它,我建议仔细查看显示如何实现具有自动布局的 UIScrollView 的众多教程之一。您将看到大多数实现将:

  • 在 UIScrollView 中添加一个 UIView(又名“containerView”)
  • 然后 View 将在所有方向上固定到 UIScrollView
  • 然后容器的宽度或高度将被设置为等于 ScrollView 或 ScrollView 的父级
  • 然后内容将添加到“containerView”内
  • 然后约束将应用到内容,容器必须环绕内容。

关于ios - 除非我添加另一个 UIView,否则 ScrollView 中的 TableView 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52622247/

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