シミュレータで遅いアニメーションがオンかオフかをプログラムで検出したい。
このようなものが便利でしょう。
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
これは開発のみを目的としています。
シミュレータで遅いアニメーションがオンかオフかをプログラムで検出したい。
このようなものが便利でしょう。
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
これは開発のみを目的としています。
幸い、それは簡単です。
float UIAnimationDragCoefficient(void);
static inline BOOL slowAnimationsEnabled()
{
#if TARGET_IPHONE_SIMULATOR
return UIAnimationDragCoefficient() != 1;
#else
return NO;
#endif
}
Swift 3.0でこれを行う方法:
@_silgen_name("UIAnimationDragCoefficient") func UIAnimationDragCoefficient() -> Float
func slowAnimationsEnabled() -> Bool {
return UIAnimationDragCoefficient() != 1.0
}
残念ながら、Swiftではコンパイル時に使用できないことに注意してTARGET_IPHONE_SIMULATOR
ください。プライベートAPIの使用が拒否される可能性があるため、これをAppStoreの送信に含めないでください。
アニメーションの継続時間を乗算する係数を返すこの関数を定義しました(遅いアニメーションが無効になっている場合は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
ではなく、を使用していることに注意してください。これは、64ビットシミュレーターで動作するために必要です。CGFloat
UIAnimationDragCoefficient()
次に、アニメーションの継続時間を単純に乗算できます。
CAAnimation animation = [CABasicAnimation animation];
animation.duration = 0.5 * FTSimulatorAnimationDragCoefficient();