之前我从未使用过 autolayout 约束。我有一个小的新应用程序我正在研究并注意到NIB的观点默认为自动布局。所以,我想我会借机与一起工作,并试图找出Apple的目标。
第一个挑战:
我需要调整MKMapView的大小,我想将它设置为新位置。如果我按照以前的方式这样做:
[UIView animateWithDuration:1.2f
animations:^{
CGRect theFrame = worldView.frame;
CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
worldView.frame = newFrame;
}];
...然后,只要兄弟视图得到更新,MKMapView就会“快速”回到原来的高度(在我的情况下,UISegmentedControl的标题正在更新[myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]
)。
所以,我想要做的是我想要做的是将MKMapView的约束从等于父视图的高度改为相对于它 <的UISegmentedControl的顶部/ em>覆盖:V:[MKMapView]-(16)-[UISegmentedControl]
我想要的是缩短MKMapView高度,以便显示地图视图下方的某些控件。为此,我想想我需要将约束从固定的全尺寸视图更改为底部被约束到UISegmentedControl顶部的约束...并且我希望它作为视图设置动画缩小到新的尺寸。
如何解决这个问题?
编辑 - 此动画不动画,但视图底部确实立即向上移动170:
[UIView animateWithDuration:1.2f
animations:^{
self.nibMapViewConstraint.constant = -170;
}];
并且nibMapViewConstraint
在IB中连接到底部垂直空间约束。
答案 0 :(得分:174)
更新约束后:
[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];
将self.view
替换为对包含视图的引用。
答案 1 :(得分:86)
这对我有用(iOS7和iOS8 +)。单击要调整的自动布局约束(在界面构建器中,例如顶部约束)。接下来让它成为IBOutlet;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
向上动画;
self.topConstraint.constant = -100;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
动画回原始地方
self.topConstraint.constant = 0;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
答案 2 :(得分:11)
苹果本身有一个非常好的教程,解释了如何使用自动布局的动画。 按照此link,然后找到名为“按示例自动布局”的视频 它提供了一些关于autolayout的有趣内容,最后一部分是关于如何使用动画。
答案 3 :(得分:3)
我做了this small demo available。它显示了如何在一个非常简单的示例中更改和动画自动布局约束。只需看看DemoViewController.m。
答案 4 :(得分:1)
大多数人使用自动布局来布局视图中的项目,并修改布局约束以创建动画。
在没有大量代码的情况下执行此操作的简单方法是创建要在Storyboard中制作动画的UIView,然后创建隐藏的UIView,以便在其中结束UIView。您可以使用xcode中的预览来确保两个UIView都在您希望的位置。之后,隐藏结束UIView并交换布局约束。
如果您不想自己编写,则有一个用于交换布局约束的podfile,称为SBP。
答案 5 :(得分:0)
无需使用更多IBOutlet reference
的约束,而不是直接access
或update
已应用约束Programmatically
或{{1}在任何使用KVConstraintExtensionsMaster
库的视图上。此库还管理Interface Builder
的{{1}}行为。
在containerView
上添加高度约束Cumulative
使用动画更新containerView的高度约束
NSLayoutConstraint