处理iOS 10中的AutoLayout约束动画差异?

Ben*_*ild 29 animation uikit autolayout nslayoutconstraint ios10

我注意到在iOS 10 Beta 5(即将试用Beta 6)中,AutoLayout约束动画的行为略有不同.

例如,此方法与以前的iOS版本中的工作方式不同:

[view addConstraints:@[constraints...]];

[view setNeedsUpdateConstraints];
[view layoutIfNeeded];

[UIView animateWithDuration:...
{
    /* adjust constraint here... */
    [view layoutIfNeeded]; // Only the adjusted constraints since previous layoutIfNeeded() call should animate change with duration.

} completion:{ ... }];
Run Code Online (Sandbox Code Playgroud)

...在我的测试中,最初添加的约束addConstraints()将在iOS 10中使用UIView 块进行动画处理......这导致了迄今为止一些时髦/不良行为.animateWithDuration()

例如,在数组中设置左/右约束(但块中的垂直约束)会导致整个视图使用此方法对角地在屏幕上进行动画处理......这是完全错误的.

有没有人知道如何正确地为iOS 9(及以下)以及10?

bee*_*con 90

尝试调用layoutIfNeeded视图的超级视图,而不是视图本身.

-

我有一个类似的问题,我的视图应该从顶部在0高度,向下到> 0高度(即(0,0,320,0)到(0,0,320,44))动画.

在iOS 10中使用Xcode 8,动画行为有很大不同.视图不是从顶部向下动画,而是从目标框架的垂直中心向上和向下动画.

我修复此问题,而不是调用layoutIfNeeded视图本身,在视图的超级视图上调用它.不知何故,这种行为得到了恢复.

希望能帮助到你!


@Ramiro的有用评论:

根据文档,layoutIfNeeded列出子视图(但不考虑当前视图本身).因此,为了更新当前视图布局,需要layoutIfNeeded从超级视图调用.

  • 根据文档,layoutIfNeeded列出了子视图(但没有考虑当前视图本身).因此,为了更新当前视图布局,需要从超级视图调用layoutIfNeeded. (5认同)