UIScrollView自动布局 - 仅垂直滚动

时间:2015-07-15 19:33:26

标签: ios uiscrollview autolayout

UIScrollView在解释自动布局约束时有点特别,因为子视图的几何填充contentSize而不是frame / bounds。 Apple在这里有一个很好的写作:https://developer.apple.com/library/ios/technotes/tn2154/_index.html

我遇到的问题是当我尝试将多行标签放入scrollView时。

示例约束如下所示:

scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-20-[image(==imageWidth)]-15-[captionLabel]|", options: .AlignAllCenterY, metrics: metrics, views: views))

我没有显示由占用更多垂直空间的其他scrollView.addConstraints()来电处理的其他子视图。

理想情况下,我希望两个元素在屏幕内水平放置,并根据需要将captionLabel分成多行。而是将整个文本渲染为一行,scrollView设置其contentSize以适应更大的宽度。

自动布局可以解决哪些选项?

编辑:对嵌套更多内容视图不太满意,因此我最终在单独的约束中设置了所需的标签宽度,并在viewWillTransitionToSize中更新了它。在我的例子中,列出了类似的"行"使用的标签中,只有第一个标签的宽度通过计算约束设置,其余的设置为等于第一个。

2 个答案:

答案 0 :(得分:3)

首先,您的视图层次结构应如下所示:

最重要的是,滚动视图中只有一个孩子,它将充当内容视图。

hierarchy

约束:

ScrollView =从边缘到主视图的4个约束,间距为0

ContentView =从边缘到ScrollView的约束,间距为0

并避免水平滚动

在ContentView和主视图(不是ScrollView)之间添加相等宽度的约束

现在将内容添加到您的内容视图中。像往常一样使用自动布局。不要忘记将0设置为标签的行数添加标签的顶部,右侧,左下限制。

UILabel

结果应该像我的一样:

Scroll

更多信息:Using UIScrollView with Auto Layout in iOS

答案 1 :(得分:0)

我不知道这是否可以帮助你(我希望能够理解这个问题),但是如果你只想要滚动垂直,你可以在你的实现中添加它:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Vertical Only ** If you have several scrolling objects detect by Tag
   if (scrollView.tag == 100)  {
    CGPoint offset = scrollView.contentOffset;
    offset.x = 0;
    scrollView.contentOffset = offset;
    }
}