iOS:如何animation到新的自动布局约束(高度)
我以前从来没有使用过自动布局约束。 我正在创build一个小的新应用程序,并注意到NIB的视图默认为自动布局。 所以,我想我会趁机与它合作,并试图找出苹果去哪里。
第一个挑战:
我需要调整一个MKMapView的大小,我想animation到新的位置。 如果我这样做,我习惯于:
[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; }];
…然后,每当兄弟视图更新(在我的情况下,一个UISegmentedControl的标题正在更新[myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]
),MKMapView将'snap'回到原来的高度。
所以,我想我想要做的是将MKMapView的约束从等于父视图的高度更改为相对于它所覆盖的UISegmentedControl的顶部: V:[MKMapView]-(16)-[UISegmentedControl]
我想要的是MKMapView的高度缩短,以便地图视图下的一些控件显示。 要做到这一点,我想我需要改变约束从一个固定的全尺寸视图,底部被约束到一个UISegmentedControl的顶部…我希望它animation视图缩小到新的大小。
这个怎么办?
编辑 – 这个animation不是animation,尽pipe视图的底部会立即移动170:
[UIView animateWithDuration:1.2f animations:^{ self.nibMapViewConstraint.constant = -170; }];
并且nibMapViewConstraint
在IB中连接到底部垂直空间约束。
更新您的约束之后:
[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];
将self.view
replace为对包含视图的引用。
这适用于我(iOS7和iOS8 +)。 点击您想调整的自动布局约束(在界面构build器中,例如顶部约束)。 接下来做一个IBOutlet;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
向上animation;
self.topConstraint.constant = -100; [self.viewToAnimate setNeedsUpdateConstraints]; [UIView animateWithDuration:1.5 animations:^{ [self.viewToAnimate layoutIfNeeded]; }];
animation回到原来的地方
self.topConstraint.constant = 0; [self.viewToAnimate setNeedsUpdateConstraints]; [UIView animateWithDuration:1.5 animations:^{ [self.viewToAnimate layoutIfNeeded]; }];
有一个从苹果本身非常好的教程,解释如何使用自动布局animation。 按照这个链接 ,然后find名为“自动布局通过示例”的video它给出了一些关于自动布局的有趣的东西,最后一部分是关于如何使用animation。
我已经提供了这个小演示 。 它以简单的例子显示了自动布局约束如何改变和animation。 只需看一下DemoViewController.m 。
大多数人使用自动布局在其视图上布局项目,并修改布局约束来创buildanimation。
没有太多代码的简单方法是创build要在Storyboard中设置animation的UIView,然后在UIView的结尾创build一个隐藏的UIView。 您可以在xcode中使用预览来确保两个UIViews都是您希望它们的位置。 之后,隐藏结束UIView并交换布局约束。
如果你不想自己写的话,有一个交换布局约束的podfile叫做SBP。
这是一个教程 。
不需要使用更多的IBOutlet reference
约束的IBOutlet reference
,而不是使用KVConstraintExtensionsMaster
库,可以直接access
或update
已应用的约束,这些约束既可以以Programmatically
方式应用,也可以通过Interface Builder
在任何视图上KVConstraintExtensionsMaster
。 这个库也在pipe理NSLayoutConstraint
的Cumulative
行为。
在containerView上添加高度约束
CGFloat height = 200; [self.containerView applyHeightConstrain:height];
使用animation更新containerView的高度约束
[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){ if (expectedConstraint) { expectedConstraint.constant = 100; /* for the animation */ [self.containerView updateModifyConstraintsWithAnimation:NULL]; } }];