使用xib autolayout,对父视图进行动画,子视图并不能自动改变布局

在xib上创建一个蓝色view,添加宽度等于屏幕宽度,高度等于150,水平和垂直居中的四个约束。
然后在view里面放一个label,添加水平和垂直居中的两个约束。
然后添加动画,代码如下:

    [UIView animateWithDuration:1.0f delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        _blueView.frame = CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, 75);
    } completion:nil];

最终效果:
图片描述

想请问,应该怎么做才能让label居中呢,我把google到的方法都试过了,好像并没有什么用,希望知道的大神指点一下。

阅读 5.7k
2 个回答

Animation block要把_blueView的高度约束给改成75

知道你已经解决了,不过我再啰嗦下。
首先,提供这个问题的两种解决方法:
(方法1)
[UIView animateWithDuration:1.0f delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{

    _blueView.frame = CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, 75);
    _label.center = CGPointMake(CGRectGetWidth(_blueView.frame)/2, CGRectGetHeight(_blueView.frame)/2);
} completion:nil];

(方法2)
就像上面说的,把_blueView的高度约束条件关联到相关类中,更改约束条件为75,然后xibView layoutIfNeeded更新约束:
_blueHeight.constant = 75;
[UIView animateWithDuration:1.0f delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{

    [_xibView layoutIfNeeded];
    _blueView.frame = CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, 75);
} completion:nil];

其次,注意以上两种方法的区别:

 (1)当xib的frame改变时,xib上的视图会按约束条件重新自动布局,方法1:_blueView的高度会复原;方法2不会;
 (2)对于两者,当xib的子视图如_blueView的frame改变时,子视图如label会按最初在xib上相对于父视图的frame(由约束条件确定,但不会根据约束自动布局,如居中并不会有效,只用于确定frame)重新布局。
 

最后,相互指正,与君共勉。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题