【问题标题】:UITableView dynamic content size height inside UIScrollView with AutoLayout带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度
【发布时间】:2016-02-22 13:47:51
【问题描述】:

我有一个UIScrollView,在这个UIScrollView里面我有一个UIView,在UIView里面我有一些UITextField's,一些UILabel's,在底部有一个UITableView

我希望UITableView 适合其内容高度,UIView 适合其内容高度,UIScrollView 适合其内容高度。

UITableView 的高度可能会随着我在使用过程中添加/删除单元格而改变。

使用 AutoLayout 处理它的最佳方法是什么?

- UIViewController
-- UIView
--- UIScrollView
---- UIView
----- UILabel
----- UITextField
----- UITextView
----- UITableView (at the bottom of the superview)

或在 xib 中:

【问题讨论】:

  • 您通常不应该嵌套滚动视图。那里有疯狂。如果您打算显示所有内容,请考虑在没有滚动视图的情况下实现类似 tableview 的视图。
  • 无论如何我都会展示所有这些,这是真的,但是,它应该是单元格,因为用户将动态添加和删除某些行,这是处理这种情况的最佳方法是通过使用 UITableView。
  • 只使用表格视图。无论如何,它是一个滚动视图,它可以包含您放入滚动视图的所有内容。不需要额外的滚动视图。只需使用单个表格视图。
  • @Fogmeister 是对的,没有火箭科学,试试吧。起初看起来很凝灰岩,但它很容易实现。

标签: ios objective-c uitableview uiscrollview autolayout


【解决方案1】:

实现这一点的最佳方法是废弃您现在拥有的层次结构并执行以下操作...

- UIViewController (or UITableViewController)
--- UITableView
----- UIView (as the tableView.tableHeaderView)
------- UILabel
------- UITextField
------- UITextView
----- Rest of the cells for the table view.

tableView.tableHeaderView 是一个单一的(不可重用的、具体的)视图,它位于表格视图内容的顶部,并随着表格视图的内容滚动。它不像节标题视图那样粘在屏幕顶部。

这将允许您删除滚动视图并将所有内容放在表格视图中,并且仍然不会更改您用于填充单元格的方法,因为它保持不变。

【讨论】:

  • 这正是我此刻的想法!很好的回答人!
【解决方案2】:

@Jan Greve 是正确的。但如果你还想做的话

  1. 将 Table View 与其父视图之间的 Bottom Space to Container 约束设置为 0
  2. 每次插入/删除都会增加/减少表格视图的高度限制(您必须以编程方式执行此操作)
  3. 将滚动视图的内容偏移设置为新的视图高度

【讨论】:

    【解决方案3】:

    AutoLayout 最好的部分是现在您不必担心UIScrollView 的内容大小。

    如果您正确设置了所有约束(没有任何警告)AutoLayout 管理滚动视图本身的内容大小。

    设置所有子视图的约束,但不要添加heightwidth 约束。

    对于contentSize,将内部视图(滚动视图的子视图)的底部约束添加到UIScrollView。这将增加 scrollView 内容的大小和高度,因为内部视图会扩大或缩小。

    更多详情:我问过question,你可以查看。您可以找到有问题的代码。

    【讨论】:

      【解决方案4】:

      您可以为 tableView 设置固定高度并将约束链接到插座。然后您需要覆盖 viewDidLayoutSubviews() 以便根据表格的 contentSize 动态设置高度:

      @IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!
      
      internal override func viewDidLayoutSubviews() {
          let height = min(self.view.bounds.size.height, self.tableView.contentSize.height)
          self.dynamicTVHeight.constant = height
          self.view.layoutIfNeeded()
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 2020-05-05
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 2014-03-08
        • 2018-08-06
        相关资源
        最近更新 更多