iOS:如何为新的自动布局约束(高度)设置动画

时间:2012-11-08 19:24:05

标签: ios uiview autolayout nslayoutconstraint

之前我从未使用过 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中连接到底部垂直空间约束。

6 个答案:

答案 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。

Here's a tutorial

答案 5 :(得分:0)

无需使用更多IBOutlet reference的约束,而不是直接accessupdate已应用约束Programmatically或{{1}在任何使用KVConstraintExtensionsMaster库的视图上。此库还管理Interface Builder的{​​{1}}行为。

在containerView

上添加高度约束
Cumulative

使用动画更新containerView的高度约束

NSLayoutConstraint