【问题标题】:How to "optionalize" block-based UIView animations?如何“可选”基于块的 UIView 动画?
【发布时间】:2011-04-14 14:06:03
【问题描述】:

我的自定义控件有一个方法 -setValue:animated:,它采用 animated 标志。

在 iOS 4 之前,我会这样编写动画:

if (animated) {
    [UIView beginAnimations:@"Foo"];
    [UIView setAnimationDuration:5.0];
}
// ... layout views ...
if (animated) {
    [UIView commitAnimations];
}

现在我写了这个:

[UIView animateWithDuration:(animated ? 5.0 : 0.0) animations:^{
    // ... layout views ...
}];

但是:这会导致一些元素没有动画!

我不止一次调用这个方法(第一次没有,第二次有动画),所以第二次取消动画,将我的新帧设置为“硬”(没有动画)。

如何用积木的方式实现可选动画?

【问题讨论】:

    标签: uiview ios4 uiviewanimation objective-c-blocks


    【解决方案1】:

    您可以在一个块中定义您想要进行的所有更改。然后,如果您希望更改动画,则将块提供给UIView animate...,或者直接执行它以进行更改而不使用动画。

    void (^myViewChanges)(void) = ^() {
        myView.alpha = 0.5;
        // other changes you want to make to animatable properties
    };
    
    if (animated) {
        [UIView animateWithDuration:5.0f animations:myViewChanges];
    } else {
        myViewChanges();
    }
    

    【讨论】:

    • 很好......但是当你传入一个动画持续时间为 0 时,为什么 Apple 不为你做这件事呢? (我知道......这里可能没有人能回答这个问题。只是发泄。)
    • @GregMaletic 之类的。但是由于系统会在动画块运行时进行处理,因此它可能并不总是给出期望的结果。我刚刚遇到一个调用 animateWithDuration:animations:completion: 调用完成块为时已晚的情况。存储完成块并在 else 子句中调用它(如上)为我修复了它。
    猜你喜欢
    • 2012-03-23
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多