如何设置约束更改的动画?

我正在用一个AdBannerView更新一个旧应用程序,当没有广告时,它会滑出屏幕。当有广告时,它会在屏幕上滑动。基本的东西

旧样式,我在动画块中设置帧。
新样式中,我对自动布局约束有一个IBOutlet,该约束确定了Y位置,在这种情况下,它与superview底部的距离,并修改常量:

-(无效)移动横幅屏幕{
[UIView动画持续时间:5个动画:^{
_addBannerDistanceFromBottomConstraint.constant=-32;
}];
横幅可见=假;
}
-(无效)移动屏幕{
[UIView动画持续时间:5个动画:^{
_addBannerDistanceFromBottomConstraint.constant=0;
}];
横幅可见=真;
}

横幅移动,与预期完全一致,但没有动画


更新:我重新观看了WWDC 12讨论掌握自动布局的最佳实践,其中包括动画。它讨论了如何使用CoreAnimation更新约束:

我尝试了以下代码,但得到了完全相同的结果:

-(无效)移动横幅屏幕{
_addBannerDistanceFromBottomConstraint.constant=-32;
[UIView animateWithDuration:2个动画:^{
[self.view setNeedsLayout];
}];
横幅可见=假;
}
-(无效)移动屏幕{
_addBannerDistanceFromBottomConstraint.constant=0;
[UIView animateWithDuration:2个动画:^{
[self.view setNeedsLayout];
}];
横幅可见=真;
}

另一方面,我已经检查了很多次,这是在主线程上执行的

两个重要注意事项:

  1. 您需要在动画块内调用layoutifneed。苹果实际上建议您在动画块之前调用它一次,以确保所有挂起的布局操作都已完成

  2. 您需要在父视图(例如self.view)上专门调用它,而不是附加了约束的子视图。这样做将更新所有受约束的视图,包括为可能受约束到已更改约束的视图的其他视图设置动画(例如,视图B附着到视图A的底部,而您刚刚更改了视图A的顶部偏移,希望视图B使用它设置动画)

试试这个:

目标-C

-(无效)移动横幅屏幕{
[self.view layoutifneed];
[ui查看动画持续时间:5
动画:^{
self.\u addBannerDistanceFromBottomConstraint.constant=-32;
[self.view layoutifneed];//在父视图上调用
}];
横幅可见=假;
}
-(无效)移动屏幕{
[self.view layoutifneed];
[ui查看动画持续时间:5
动画:^{
self.\u addBannerDistanceFromBottomConstraint.constant=0;
[self.view layoutifneed];//在父视图上调用
}];
横幅可见=真;
}

Swift 3

UIView.animate(持续时间:5){
self.\u addBannerDistanceFromBottomConstraint.constant=0
self.view.layoutifneed()
}

发表评论