Ios UIScrollView分页自动布局&;故事板

Ios UIScrollView分页自动布局&;故事板,ios,objective-c,autolayout,Ios,Objective C,Autolayout,关于使用autolayout的滚动视图和滚动视图分页,有很多答案,但我找不到一件事同时解决这两个问题 我不想做任何花哨的事情……只是想通过分页水平滚动的7全屏图像视图,但为了简单起见(哈!),我决定在情节提要中尝试一下 控制器设置为自由尺寸,宽度为2240(320*7)。然后我按照苹果建议的自动布局方式进行设置 UIScrollview /-----UIView /----------Content (7 image views) 与内部的UIView一样,scrollview对所有边都有0/

关于使用autolayout的滚动视图和滚动视图分页,有很多答案,但我找不到一件事同时解决这两个问题

我不想做任何花哨的事情……只是想通过分页水平滚动的
7
全屏图像视图,但为了简单起见(哈!),我决定在情节提要中尝试一下

控制器设置为自由尺寸,宽度为
2240(320*7)
。然后我按照苹果建议的自动布局方式进行设置

UIScrollview
/-----UIView
/----------Content (7 image views)
与内部的UIView一样,scrollview对所有边都有
0/0/0/0
约束

当“启用分页”处于禁用状态时,它的行为会非常漂亮-与预期完全一致。但是一旦我打开分页,一次滑动就会让视图变得疯狂,滚动整个
2240
宽度,然后反弹回来,最终到达正确的页面


我知道我有一个千真万确的选择,就是放弃一切,用编程的方式去做,但我的固执想弄明白这一点。这一定是可能的

我有一个UIScrollView,分页和自动布局工作得非常好。以下是我的设置:

UIView  // Main view
|---> Dummy UIView   // See below
      |---> UIScrollView
            |---> Content UIView
                  |---> Page 1 Container
                  |---> Page 2 Container
我使用的约束是
Dummy-UIView->Parent-UIView
是我想要的分页滚动视图的大小,并且
UIScrollView->Dummy-UIView
在所有方面都是(0,0,0,0)。这只是常规的自动布局工具,它创建了一个虚拟UIView,我想在其中放置scrollview和一个完全填充虚拟UIView的
UIScrollView

有关自动布局和
UIScrollView
,请参阅苹果的技术说明:

scrollview中的内容必须具有固有大小。它不能依赖scrollview来获取其大小

如技术说明所示,将
内容视图的所有四个侧面的约束设置为
UIScrollView
到(0,0,0,0)。确切的值其实并不重要,因为您告诉
UIScrollView
的只是这是从中获取
contentSize
的视图

此时,Xcode将抱怨
内容视图
没有固有大小。这里是诀窍:这就是我们使用上面创建的
虚拟UIView
的地方。
虚拟UIView
的大小正好是
UIScrollView
中每个页面的大小

因此,我们使用AutoLayout将
内容UIView
的高度设置为
虚拟UIView
的高度,将
内容UIView
的宽度设置为
虚拟UIView
宽度的页数倍。(对于后者,将约束中的乘数更改为页数)

现在,在
Content ui视图
中创建页面,并在
ui视图
中将
Paging Enabled
设置为yes,然后使用自动布局在
ui视图
中进行分页

我已经在IOS 6、7和8上测试过了

更新:


以下是一个按要求使用此设置的示例项目:

可以使用scrollView的大小来设置contentView的大小,与之相反;这是在iOS 8.2 beta 3中测试的

请注意,我是通过编程实现的,但希望这对其他人有用。层次结构是:

root: UIView
  scrollView: UIScrollView
    contentView: UIView
      page0
      page1
      ...
  • 添加约束以相对于根和scrollView的任何同级定位scrollView

  • 将contentView侧面附加到其superview(滚动视图): “H:|[contentView]|”
    “V:|[contentView]|”

  • 向contentView和scrollView添加大小相等约束;这一部分与TN2154相矛盾(TN2154表示“不要依赖滚动视图获取其大小”):

    contentView.height==scrollView.height
    contentView.width==scrollView.width

  • 注:以上是编程实例化高度约束的组成符号

  • 相对于其superview(contentView)布局页面;为此,我将第一页left/top固定到contentView left/top,并将后续页left/top固定到上一页right/top
  • Koustub让我走上了正确的道路,这要归功于Koustub——他的解决方案很有效,但通过一些修改,我能够消除虚拟视图。

    在Interface Builder中使用内容构建分页UIScrollView

    我还建议将其用作UIScrollView的内容视图,因为它可以从本质上降低布局的复杂性

    使用传统方法时,内容视图中的每个条目视图至少有5个约束条件

    • 导致以前的条目
    • 自上而下
    • 尾随到下一个条目
    • 自下而上
    • 与滚动视图的宽度相等
    堆栈视图自动排列其内容,因此每个条目的唯一约束应为“与滚动视图的宽度相等”


    检查此项目以查看堆栈视图的运行情况。

    下面是一个具有上述解决方案的示例项目:此答案非常好,而清晰的示例项目使其变得更好。非常好的方法。另外,如果您需要嵌套ScrollView来实现垂直滚动分页,那么最好使用xib,内部scrollview位于模拟视图中。该示例适用于固定数量的视图,因为它添加了所需的视图数量。如果我们必须显示随时间变化的动态内容,该怎么办。@KostubDeshmukh这对旋转没有帮助。请滚动到第二页并转到横向。请告诉我您是否有解决方案:)thxSmart解决方案,将堆栈视图作为滚动视图的内容视图!我喜欢这个概念,但视图2和3位于ViewController的右侧,因此实际上无法在情节提要上查看/编辑。为VC选择“Freeform”会相应地调整UIScrollView和UIStackView的大小,因此也没有更好的效果。有什么线索吗?谢谢你