使用自动布局时 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 使用自动布局动态扩展为滚动视图内的文本