2012-11-07 2 views

答えて

7

幸いにも、それは簡単です:

float UIAnimationDragCoefficient(void); 

static inline BOOL slowAnimationsEnabled() 
{ 
#if TARGET_IPHONE_SIMULATOR 
    return UIAnimationDragCoefficient() != 1; 
#else 
    return NO; 
#endif 
} 
+0

うわー。私はそのことについて知らなかった! –

+0

残念ながら、AppleはiOS 7でそれを壊しました。 –

+0

クリスチャン、それはまだiOS 8で動作します。64ビットでも動作する私のソリューションを参照してください。 –

4

残念ながら、それは簡単ではありません。シミュレータで低速CAAnimationsを作成する方法については、this code0xcedでご覧ください。

+0

うわー!エキサイティングなもの! – hfossli

2

私は(そうでない場合は、遅さの要因をゆっくりとアニメーションが無効になっている場合1)とアニメーションの継続時間を乗算する係数を返すこの関数を定義した:

CGFloat FTSimulatorAnimationDragCoefficient(void) { 
    static float (*UIAnimationDragCoefficient)(void) = NULL; 
#if TARGET_IPHONE_SIMULATOR 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     UIAnimationDragCoefficient = (float (*)(void))dlsym(RTLD_DEFAULT, "UIAnimationDragCoefficient"); 
    }); 
#endif 
    return UIAnimationDragCoefficient ? UIAnimationDragCoefficient() : 1.f; 
} 

注意私はfloatを使用し、UIAnimationDragCoefficient()関数の戻り値の型にはCGFloatではありません。これは、64ビットシミュレータを使用する場合に必要です。

それから私は単にアニメーションの再生時間を掛けることができます:スウィフト3.0でこれを行うにはどのように

CAAnimation animation = [CABasicAnimation animation]; 
animation.duration = 0.5 * FTSimulatorAnimationDragCoefficient(); 
1

:残念ながらあなたはスウィフトにコンパイル時にTARGET_IPHONE_SIMULATORを使用することはできません

@_silgen_name("UIAnimationDragCoefficient") func UIAnimationDragCoefficient() -> Float 

func slowAnimationsEnabled() -> Bool { 
    return UIAnimationDragCoefficient() != 1.0 
} 

注意を、プライベートAPIの使用を拒否される可能性があるため、これをApp Storeの投稿に含めるべきではありません。

+0

さて、プライベートAPIを使用しています。あなたのアプリはアプリストアで拒否されるかもしれませんが、そうですか? – hfossli

+1

はい、コードでこれを使ってアプリケーションストア用にビルドすべきではありません(ただし、これはアプリストアには必要ありません)。私は、別のビルドターゲットでこれを使用し、カスタムSwiftフラグを定義することをお勧めします。 – stu