使用自动布局时 UIScrollview 的中心内容

Posted

技术标签:

【中文标题】使用自动布局时 UIScrollview 的中心内容【英文标题】:Center contents of UIScrollview when using autolayout 【发布时间】:2014-07-29 17:45:48 【问题描述】:

我在我的项目中使用了自动布局,并且我有一个滚动视图,其中有一个居中的按钮。我已经让滚动视图滚动,但没有占据整个屏幕。

我已尝试按照此处的教程进行操作:https://developer.apple.com/library/ios/technotes/tn2154/_index.html,并且我已在此处查看了一些类似的问题。问题是我希望滚动视图的内容居中,而不是固定在顶部/底部/左侧/右侧。

这是我的视图层次结构:

你能帮帮我吗?

【问题讨论】:

【参考方案1】:

您在滚动视图和它的超级视图之间添加了约束。这些约束决定了滚动视图的框架。你可以把滚动视图想象成一个窗口,通过它你可以看到后面的内容。框架是窗口的大小。当然,您可以滑动窗口,这样您就可以看到部分内容。

现在你有了窗口的大小,但你还需要告诉 Xcode 内容的大小。如果你只是说把所有的东西都放在中间而不告诉宽度,Xcode怎么知道中间在哪里?

所以,你必须告诉宽度(以及高度)。让我们考虑一个简单的例子,如何在滚动视图中将单个标签居中。

您应该首先将滚动视图的边缘固定到其超级视图,就像您所做的那样。之后,您应该在标签边缘和滚动视图边缘之间添加约束,此外,您还应该添加标签的 with 和 height 约束。

前导空格、尾随空格和宽度一起给出内容的宽度,而顶部空格、底部空格和高度一起给出内容的高度。

|---前导空格---|标签宽度|---尾随空格---|

|---------滚动视图的内容-------------|

但是您可能希望将内容视图的 with 设置为等于屏幕的 with,然后您需要进行一些编程。在你的代码中设置插座属性

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *trailingSpace;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *leadingSpace;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *width;

在您的viewWillLayoutSubviews 中执行此操作

CGFloat contentWidth = self.view.frame.size.width;
CGFloat horiPadding = (contentWidth - self.width.constant) / 2;
_trailingSpace.constant = horiPadding;
_leadingSpace.constant = horiPadding;

现在标签位于滚动视图的水平中心!你的滚动视图已经知道它的内容,所以你不需要为你在滚动视图中添加的任何其他视图执行此操作:你只需添加中心约束即可。

你也可以对高度做同样的事情。

【讨论】:

所以基本上,滚动视图层次结构中的至少一项必须锚定到所有四个边。 @jancakes 是的,我尽量不将其视为“锚”,而是只需要为滚动视图完成的操作,以便知道其内容的大小

以上是关于使用自动布局时 UIScrollview 的中心内容的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局约束在 UIScrollView 内为 UIView 设置动画

使用自动布局向 UIScrollView 添加动态大小的视图(高度)

UITextView 使用自动布局动态扩展为滚动视图内的文本

当我将 setContentSize 与自动布局一起使用时,UIScrollView 崩溃

UIView 不会在 UIScrollView 内垂直滚动

子视图内的 UIScrollview 高度动态变化