【问题标题】:Why are completion handlers of [UIView animate] called in a wrong order?为什么 [UIView animate] 的完成处理程序以错误的顺序调用?
【发布时间】: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)添加了一个快速修复。

我的问题是:

  1. 如果动画重叠,为什么第一个动画完成处理程序被称为最后一个?
  2. 有什么更好的方法可以丢弃以前的“重叠”动画?

【问题讨论】:

    标签: ios uiview uiviewanimation


    【解决方案1】:

    在完成时检查 finished 标志:

    if (finished) {
     _btn1.hidden = YES;
     _btn2.hidden = YES; 
    }
    

    【讨论】:

    • 谢谢,这个flag确实有用,奇怪我错过了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多