如何让自动布局在 Xcode 中工作
Posted
技术标签:
【中文标题】如何让自动布局在 Xcode 中工作【英文标题】:how to get auto layout to work in Xcode 【发布时间】:2013-07-31 20:36:50 【问题描述】:我查看了http://developer.apple.com/library/ios/#recipes/xcode_help-interface_builder/articles/UnderstandingAutolayout.html,但解释很模糊。
我在 iOS 6 上。我有一个带有两个子视图的视图控制器,一个在另一个之上:
我想使用自动布局来设置视图,如果我以编程方式更改顶视图的框架,底视图将调整大小以适应顶视图的新框架。也就是说,如果我增加顶视图的高度,底视图的高度应该降低以保持两个视图之间的相同间隔;如果我降低顶视图的高度,则会发生相反的情况。
我在 Xcode 中为这两个视图获得的默认约束是:
如果我按住 Command 并调整顶部(地图)视图的大小,底部(表格视图)似乎会正确地垂直收缩或扩展以遵守它们之间的空间限制。
但是,当我尝试通过代码修改顶视图的框架或边界时,例如:
self.topView.frame = CGRectMake(0, 0, 320, 514);
底视图不会缩小。 那我错过了什么?
【问题讨论】:
【参考方案1】:你不能这样修改self.topView.frame
。设置框架是自动布局的工作。您需要修改约束,然后让自动布局更新框架。
在您的视图控制器中创建NSLayoutConstraint
类型的插座:
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *topViewHeightConstraint;
将插座连接到故事板顶视图上的 height=127 约束。 See this answer 如果您需要更多帮助将插座连接到约束。
然后,要改变顶视图的高度,并让自动布局也更新底视图的框架,设置约束的常量:
self.topViewHeightConstraint.constant = 514;
在运行循环结束时(不是立即,而是在屏幕更新之前),自动布局将修改两个视图的框架以满足更改后的约束。
【讨论】:
哦,好的,我明白了。我认为他们的工作方式相反:框架的变化触发了约束的变化。谢谢!最后一件事,如果您愿意,我可以创建一个单独的问题,但是,我尝试将NSLayoutConstraint.constant
值更改包装在 UIView animateWithDuration:...
调用中,希望能够为调整大小设置动画,但它没有动画。我现在正要直接尝试 CoreAnimation,但想知道您是否知道它是否可能?
您需要强制 UIKit 在动画块内执行布局传递。您可以在块内执行[self.topView layoutIfNeeded]
,或者如果您使用带有选项的完整动画方法,您可以传递UIViewAnimationOptionLayoutSubviews
标志。以上是关于如何让自动布局在 Xcode 中工作的主要内容,如果未能解决你的问题,请参考以下文章