有没有办法禁用ios上的所有动画?

时间:2014-07-14 16:08:12

标签: ios kif

仍应调用回调。我想用它进行KIF测试。目的是减少测试时间。

3 个答案:

答案 0 :(得分:8)

最简单的方法是将窗口图层的speed属性设置为较大的数字。这样做是为了控制动画的速度;值> 1会增加速度。设置一个足够高的值,动画将比帧长度短(1/60秒)。

这是最佳选择,因为它会同时影响UIKit和核心动画动画。从iOS7开始,很多系统动画实际上是直接用Core Animation执行的。

答案 1 :(得分:8)

点缀@Leo的回答:

如果您不需要细粒度控制,在大多数情况下,设置应用程序的keyWindow的speed属性将加速所有动画。所以你只需要:

[UIApplication sharedApplication].keyWindow.layer.speed = 5.0;

这可以在任何你想要的地方调用。我们在所有测试中都设置了它,因此动画总是很快。 (通过子类化或使用beforeAll实现,如果你的BDD或你想要的任何结构。)

另外,如果您感兴趣的话,我们已经看到,当从速度= 1.0到速度= 5.0时,平均速度增加大约10%,其中5.0实际上足够快,几乎是瞬间的。这显然取决于您的应用程序通过多少动画,但考虑到启用它是多么容易,对于大多数测试来说,这是不费脑筋的。

答案 2 :(得分:0)

<强>更新

我试过这个似乎有效。动画将“运行”,它们只是没有时间......

static void (*__original_CALayerAddAnimationForKey)( CALayer *, SEL, CAAnimation *, NSString * ) ;
static void CALayerAddAnimationForKey( CALayer * self, SEL _cmd, CAAnimation * anim, NSString * key )
{
    anim.duration = 0.0 ;
    (*__original_CALayerAddAnimationForKey)( self, _cmd, anim, key ) ;
}

static id<CAAction> CALayerActionForKey( CALayer * self, SEL _cmd, NSString * key )
{
    return nil ;
}


int main(...)
{
    // head patch -[CALayer addAnimation:forKey:] to set all animation durations to 0.0
    __original_CALayerAddAnimationForKey = (void(*)(CALayer *, SEL, CAAnimation *, NSString*))class_getMethodImplementation( [ CALayer class ], @selector( addAnimation:forKey: ) ) ;
    assert( __original_CALayerAddAnimationForKey ) ;

    class_replaceMethod( [ CALayer class ], @selector( addAnimation:forKey: ), (IMP)CALayerAddAnimationForKey, "v@:@@" ) ;

    // replace -[CALayer actionForKey:] with a function that always returns nil (no action)
    class_replaceMethod( [ CALayer class ], @selector( actionForKey: ), (IMP)CALayerActionForKey, "@@:@" ) ;

    ...

}

这会将传递给 -addAnimation:forKey:的每个动画的持续时间更改为 0.0 ,并且对所有对 -actionForKey的调用都返回nil:

您实际上无法删除动画 - 它们可能会产生与其完成相关的副作用和操作。


继@michaels建议:

你可以尝试调整 -CALayer addAnimation:forKey:什么都不做。 (也许 -CALayer actionForKey:返回 null 。)

#import <objc/runtime.h>

static void CALayerAddAnimationForKey( CALayer * self, SEL _cmd, NSString * key ) { }

...

class_replaceMethod( [ CALayer class ], 
    @selector( addAnimation:forKey: ), 
    (IMP)CALayerAddAnimationForKey, 
    "v@:@@" ) ;