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

我正在使用来更新旧的应用,AdBannerView并且当没有广告时,它会滑出屏幕。出现广告时,它会在屏幕上滑动。基本的东西。

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

- (void)moveBannerOffScreen {

[UIView animateWithDuration:5 animations:^{

_addBannerDistanceFromBottomConstraint.constant = -32;

}];

bannerIsVisible = FALSE;

}

- (void)moveBannerOnScreen {

[UIView animateWithDuration:5 animations:^{

_addBannerDistanceFromBottomConstraint.constant = 0;

}];

bannerIsVisible = TRUE;

}

横幅完全按预期移动,但没有动画。

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

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

- (void)moveBannerOffScreen {

_addBannerDistanceFromBottomConstraint.constant = -32;

[UIView animateWithDuration:2 animations:^{

[self.view setNeedsLayout];

}];

bannerIsVisible = FALSE;

}

- (void)moveBannerOnScreen {

_addBannerDistanceFromBottomConstraint.constant = 0;

[UIView animateWithDuration:2 animations:^{

[self.view setNeedsLayout];

}];

bannerIsVisible = TRUE;

}

附带说明一下,我已经检查了无数次,并且这是在主线程上执行的。

回答:

两个重要说明:

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

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

试试这个:

目标C

- (void)moveBannerOffScreen {

[self.view layoutIfNeeded];

[UIView animateWithDuration:5

animations:^{

self._addBannerDistanceFromBottomConstraint.constant = -32;

[self.view layoutIfNeeded]; // Called on parent view

}];

bannerIsVisible = FALSE;

}

- (void)moveBannerOnScreen {

[self.view layoutIfNeeded];

[UIView animateWithDuration:5

animations:^{

self._addBannerDistanceFromBottomConstraint.constant = 0;

[self.view layoutIfNeeded]; // Called on parent view

}];

bannerIsVisible = TRUE;

}

迅捷3

UIView.animate(withDuration: 5) {

self._addBannerDistanceFromBottomConstraint.constant = 0

self.view.layoutIfNeeded()

}

以上是 如何为约束更改设置动画? 的全部内容, 来源链接: utcz.com/qa/408272.html

回到顶部