使用autolayout为包含子视图的视图设置动画

Jav*_*rri 7 animation objective-c ios autolayout

这是设置:

  • 在Interface Builder上创建的UIView,链接到IBOutlet变量(_vAbout)
  • 我们想要动画的这个视图的约束,链接到IBOutlet变量(_ctrBottomAboutView)

我正在使用此代码进行动画处理:

_ctrBottomAboutView.constant = -100;
[UIView animateWithDuration:0.5 animations:^{
    [_vAbout layoutIfNeeded];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:只要视图中有任何子视图,动画就不起作用.但是,如果视图没有子项,则动画可以正常工作.

你知道解决方案吗?我已经尝试了一切:添加和删除约束而不是修改常量值,在Interface Builder上向子视图添加约束...

Jav*_*rri 4

经过一些从头开始的空项目实验,这是我发现的:

给定 A 我们想要动画的视图和 B 的超级视图

  • 请务必记住,接收消息的视图layoutIfNeeded就是拥有约束的视图。
  • NSLayoutAttributeWidth在和 的情况下,NSLayoutAttributeHeight约束的所有者实际上是 A,但在所有其他情况下,拥有约束的视图是 B

然而

  • 如果 A 没有任何子视图,我们可以[A layoutIfNeeded]随时调用我们的代码,它将起作用
  • 如果 A 有一个或多个子视图,但我们启动动画,viewDidLoad我们可以调用[A layoutIfNeeded]它,它将起作用