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

Mel*_*emi 122 uiview ios 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;
}];
Run Code Online (Sandbox Code Playgroud)

...然后,只要兄弟视图得到更新,MKMapView就会"快速"回到原来的高度(在我的情况下,正在更新UISegmentedControl的标题[myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]).

所以,我觉得我想要做的是从等于父视图的HIGHT到可相对于UISegmentedControl的顶部,它改变的MKMapView的限制覆盖:V:[MKMapView]-(16)-[UISegmentedControl]

我想要的是缩短MKMapView高度,以便显示地图视图下方的一些控件.为此,我认为我需要将约束从固定的全尺寸视图更改为底部被约束到UISegmentedControl顶部的约束...并且我希望它在视图缩小到新大小时进行动画处理.

怎么会这样呢?

编辑 - 虽然视图底部立即向上移动170,但此动画不是动画:

    [UIView animateWithDuration:1.2f
         animations:^{
             self.nibMapViewConstraint.constant = -170;

    }];
Run Code Online (Sandbox Code Playgroud)

并且nibMapViewConstraint在IB中连接到底部垂直空间约束.

Ed *_*nus 177

更新约束后:

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];
Run Code Online (Sandbox Code Playgroud)

替换self.view为对包含视图的引用.

  • 不要为每个视图调用`layoutIfNeeded`,只需调用`[[self.view superview] layoutIfNeeded];` (12认同)
  • 如果需要,您还需要在这些视图上调用布局.但它并没有真正正常工作,因为这也会为视图刷新设置动画.如何仅在其他视图中为约束调整设置动画? (7认同)
  • 这适用于视图本身,但是对该视图有约束的视图只是立即移动.我该怎么办?TY (4认同)
  • **注意:**如果使用`UIViewAnimationOptionBeginFromCurrentState`,布局约束将被设置为*BEFORE*动画! (3认同)
  • @ngb你需要在动画块里面改变约束常量**.这样,约束随动画而变化,您可以继续使用`UIViewAnimationOptionBeginFromCurrentState`. (2认同)

Dev*_*evC 86

这对我有用(iOS7和iOS8 +).单击要调整的自动布局约束(在界面构建器中,例如顶部约束).接下来让它成为IBOutlet;

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
Run Code Online (Sandbox Code Playgroud)

动画向上;

    self.topConstraint.constant = -100;    
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded]; 
    }];
Run Code Online (Sandbox Code Playgroud)

动画回到原始位置

    self.topConstraint.constant = 0;    
    [self.viewToAnimate setNeedsUpdateConstraints];  
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded];
    }];
Run Code Online (Sandbox Code Playgroud)

  • 哇!!这实际上确实有效!这个答案让我大开眼界.谢谢你太多了! - 埃里克 (2认同)
  • @ErikvanderNeut它也适合我,很高兴它有用.我将从现在开始制作动画约束而不是帧位置. (2认同)

小智 11

苹果本身有一个非常好的教程,解释了如何使用自动布局的动画.点击此链接,然后找到名为"按示例自动布局"的视频.它提供了一些有关自动布局的有趣内容,最后一部分是关于如何使用动画.


归档时间:

查看次数:

77286 次

最近记录:

10 年 前