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.viewreplace为对包含视图的引用。

这适用于我(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库,可以直接accessupdate已应用的约束,这些约束既可以以Programmatically方式应用,也可以通过Interface Builder在任何视图上KVConstraintExtensionsMaster 。 这个库也在pipe理NSLayoutConstraintCumulative行为。

在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]; } }];