【问题标题】:scaling UIScrollView contentSize to fit UIView with variable-height UITableView inside缩放 UIScrollView contentSize 以适应内部具有可变高度 UITableView 的 UIView
【发布时间】:2011-11-02 04:35:43
【问题描述】:

我有一个带有 uiscrollview 的 uiview 作为 nib 中的子视图。 然后,我加载另一个带有 uitableview 的 uiview 作为另一个 uiview 的子视图(在此视图内的其他元素中)作为 uiscrollview 的子视图。

即UISCrollView -> UIView -> UITableView(以及UIView内部的一些其他视图)。

我需要做以下事情:

一旦我知道 tableview 的最终高度(取决于单元格的数量和它们的高度),我需要调整包含它的 uiview 的大小,然后调整包含滚动视图的 contentSize 属性的大小。

但我不知道 tableview 的最终大小在哪一点是已知的(因为它可以根据其单元格将容纳的文本量动态更改大小),我也不知道 tableview 会超过多少uiview(默认为 320 x 460)。

我尝试在 viewdidload 上将包含 tableview 的视图设置为 900 的高度并将其设置为 sizeToFit,希望它会随着 tablecells 添加到 tableview 而缩小(假设添加单元格时 tableview 的框架会适当地缩放) .但这似乎不起作用。

有什么想法吗? 谢谢!

【问题讨论】:

    标签: iphone ios uitableview uiview uiscrollview


    【解决方案1】:

    我刚刚遇到了类似的情况(UIScrollView -> UITableView),并且用头撞了好几个小时。简短的回答是:直到我的 ViewController(管理 UIScrollView)被发送到viewWillAppear: 之前,作为调整大小基础的正确大小才可用。在此之前,我发现这些值是设置的,但经常是错误的。 (例如,我第一次尝试这样做是在 viewDidLoad:,并且尺寸值在那里更改,但它们错误!)

    所以我的解决方案是这样的:

    • viewDidLoad: 中,一旦您的数据到位,将您封闭的 UITableView 设置为reloadData
    • viewWillAppear: 中执行以下操作(假设tableView 是封闭的UITableView,scrollView 是封闭的UIScrollView):

      tableView.frame = (CGRect){ 
          tableView.frame.origin,
          tableView.contentSize 
      };
      // Finally, set content size based on the last element in the scrollView
      // in my case, the last element IS the tableView, yours might be different
      scrollView.contentSize = 
          CGSizeMake(scrollView.width 
                     - scrollView.contentInset.left
                     - self.scrollView.contentInset.right,
                     tableView.top
                     + tableView.height);
      

    注意,当我在viewWillAppear: 之前检查它们时,我得到了一些非常奇怪的数字;例如,tableView.contentSize 似乎是默认 rowHeight * 行数的乘积,忽略了我的自定义行高并排除了任何分隔符!很奇怪。

    【讨论】:

    • 您的回答节省了我在家的时间。非常感谢:-)
    【解决方案2】:

    这只是一个猜测,但是由于 UITableView 是 UIScrollView 的子类,在调用 reloadData 之后,你可以使用 contentSize 属性查看它的整体大小吗?您可以使用 tableview 的大小来调整 UIView 的大小和 scrollView 的 contentSize。

    【讨论】:

    • 我可以尝试一下。不过,我应该在哪里打电话重新加载数据?我的意思是,我很确定方法调用的顺序是:viewDidLoad -> numberOfSectionsInTableView -> numberOfRowsInSection -> cellForRowAtIndexPath。至此,tableview 构建完成。那么我现在应该在哪里调用 reloadData 呢?还是在我刚才提到的调用链之后默认调用?
    • 嗯...我承认我不完全确定在加载过程的哪个点填充了表格视图,但你确定它是在 viewDidLoad 之后出现的吗?我认为,如果您调用 reloadData inside of viewDidLoad 然后立即检查 contentSize,它将是正确的值。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2013-04-28
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多