我想以编程方式检测模拟器中慢速动画是打开还是关闭。
像这样的东西会很方便。
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
这仅用于开发目的。
我想以编程方式检测模拟器中慢速动画是打开还是关闭。
像这样的东西会很方便。
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
这仅用于开发目的。
Fortunately it's easy:
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
}
请注意,不幸的是,您不能TARGET_IPHONE_SIMULATOR
在 Swift 中在编译时使用,并且您不应将其包含在您的 App Store 提交中,因为您可能会因使用私有 API 而被拒绝。
我定义了这个函数,它返回将动画持续时间乘以的因子(如果禁用慢速动画,则为 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
, 不是CGFloat
作为被调用UIAnimationDragCoefficient()
函数的返回类型。这是使用 64 位模拟器所必需的。
然后我可以简单地将动画持续时间相乘:
CAAnimation animation = [CABasicAnimation animation];
animation.duration = 0.5 * FTSimulatorAnimationDragCoefficient();