嵌套的UIScrollviews行为异常

时间:2018-10-26 00:07:03

标签: ios swift uitableview uiscrollview autolayout

我有以下自动布局驱动的设置:

  • 主viewController,内部带有滚动视图。 Scrollview固定到Superview边缘。这一个上下滚动。 滚动视图顶部的一些普通的,固定大小的视图

  • 另一个滚动视图。这一个向左和向右滚动。第二个滚动视图包含两个并排的表视图。这个想法是用户可以在它们之间切换。它们都包含少量的单元格,所有单元格的宽度与屏幕相同,高度为72pts。

我要解决的问题是tableview内容的大小不相同。左边一个说6个单元格,右边一个说3个单元格。

我的第一种方法是动态更改第二个滚动视图的高度,以匹配当前可见的表格视图。最终发生的事情是,如果将animated设置为true,则在两个表视图之间进行切换(通过执行setContentOffset:animated :)会变得非常错误-它将调整内容偏移,因此所有内容均不在屏幕上。实际上,它将内容偏移设置为,然后在我切换大约12次后重置。太奇怪了,我放弃了。

现在,我正在尝试仅调整主滚动视图的内容插图以抵消当前表视图内容中的空白,而且这也很奇怪。当我在viewDidLoad中设置底部内容插入时,它可以正常工作。当我在表视图变为当前时设置它时,它什么也没做。

有什么作用?什么情况会导致这些视图交互行为不正常?

2 个答案:

答案 0 :(得分:2)

  • 每个表使用不同的tableViewController
  • 将它们嵌入pageViewController中。
  • pageViewController视图的顶部添加一些固定大小的普通视图。
  • scrollViewDelegate中符合pageViewController
  • scrollViewDidScroll从tableViews传递到pageViewController
  • 设置tableViews插图以匹配顶部的那些固定大小的视图。
  • 根据滚动条更改高度。

这是您实现所需功能的方式。 希望对您有所帮助。

答案 1 :(得分:0)

您可以尝试将布局更改为:

1)ScrollView固定到超级视图边缘

2)添加简单视图,并为超级视图添加前导,尾随,顶部,底部,宽度的约束,并为高度(但在内容视图本身)添加最后一个约束。将“高度限制”设置为某个值,并将其优先级更改为100。

Content View inside ScrollView

Content View height constraint

3)内容视图的宽度等于滚动视图,确保用户不能在水平方向滚动。您要添加到内容视图的所有视图都应具有高度约束(它们可以是固定的,也可以从其子视图计算得出)并相互约束,最后一个底部约束是内容视图的底部约束。

Second scroll view inside content view

4)添加到第二个滚动视图的前导,尾随约束到超级视图(内容视图),顶部-到同级,底部也到同级或超级视图的底部。

5)对于第二个滚动视图,重复2步,但现在将固定高度设置为,并将宽度优先级更改为100。这确保您只能在水平方向滚动。 Second Content View Constraint settings

6)对表视图执行相同的操作。由于表格视图可以具有不同数量的单元格,因此您应该手动计算表格视图的宽度大小以适合所有内容,而无需滚动表格视图(非滚动视图)并更改其宽度约束。这种方法导致更改第二滚动视图内容视图的大小,因为它的优先级较低,并且可以更改其值 Table view constraint settings

此方法的缺点-如果嵌套表或集合视图中有很多数据,它们将加载其所有单元格,并且不会重复使用它们。这可能会导致内存和性能问题。但是,如果您具有简单的数据和简单的嵌套表视图布局,那么一切都会很好

希望这会有所帮助