コールバックは引き続き呼び出す必要があります。KIFテストに使用したいです。テスト時間の短縮が目的です。
3 に答える
最も簡単な方法はspeed
、ウィンドウ レイヤーのプロパティを高い数値に設定することです。これが行うことは、アニメーションの速度を制御することです。>1 の値は速度を上げます。十分に高い値を設定すると、アニメーションはフレームの長さ (1/60 秒) よりも短くなります。
UIKit アニメーションと Core Animation アニメーションの両方に影響するため、これが最適なオプションです。iOS7 以降、多くのシステム アニメーションは、実際には Core Animation で直接実行されます。
アップデート:
私はこれを試してみましたが、うまくいくようです。アニメーションは「実行」されますが、まったく時間がかかりません...
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@:@@" ) ;