【发布时间】:2021-03-20 18:35:19
【问题描述】:
在我的项目中有一个 ViewController 包含一些子视图(例如按钮)。 它显示/隐藏这些按钮,始终带有动画。
它有一个这样的界面:
@interface MyViewController: UIViewController
- (void)setMyButtonsVisible:(BOOL)visible;
@end
一个实现看起来像这样:
- (void)setMyButtonsVisible:(BOOL)visible
{
if( visible )
{
// "show"
_btn1.hidden = NO;
_btn2.hidden = NO;
[UIView animateWithDuration:0.2 animations:^{
_btn1.alpha = 1.0;
_btn2.alpha = 1.0;
}];
}
else
{
// "hide"
[UIView animateWithDuration:0.2 animations:^{
_btn1.alpha = 0.0;
_btn2.alpha = 0.0;
} completion:^(BOOL finished) {
_btn1.hidden = YES;
_btn2.hidden = YES;
}];
}
}
当[_myVC setMyButtonsVisible:NO] 被调用,然后一段时间(> 0.2s) [_myVC setMyButtonsVisible:YES] 被调用,一切正常。
然而,setMyButtonsVisible:YES 在 (setMyButtonsVisible:NO,动画重叠,最后调用 setMyButtonsVisible:NO 回调。
我尝试将“隐藏”持续时间更改为 0.1,但没有帮助 - 在“隐藏(0.1)”+“显示(0.2)”调用之后,“隐藏”回调在“显示”回调之后调用而且我的按钮不可见。
我通过缓存visible 参数并检查“隐藏”完成处理程序(如果状态应为!visible)添加了一个快速修复。
我的问题是:
- 如果动画重叠,为什么第一个动画完成处理程序被称为最后一个?
- 有什么更好的方法可以丢弃以前的“重叠”动画?
【问题讨论】:
标签: ios uiview uiviewanimation