4

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

4

3 回答 3

9

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

这是最好的选择,因为它同时影响 UIKit 和 Core Animation 动画。从iOS7开始,很多系统动画其实都是直接用Core Animation来实现的。

于 2014-07-17T20:59:57.920 回答
8

美化@Leo的回答:

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

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

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

此外,如果您有兴趣,我们已经看到从 speed = 1.0 到 speed = 5.0 时,平均速度增加了大约 10%,其中 5.0 实际上快到几乎是瞬时的。这显然会根据您的应用程序通过多少动画而有所不同,但考虑到启用它的容易程度,这对于大多数测试来说都是轻而易举的事。

于 2014-07-20T18:11:23.627 回答
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@:@@" ) ;
于 2014-07-17T21:15:10.430 回答