在代码中检测iOS模拟器中是否打开/关闭慢动画

时间:2012-11-07 17:49:01

标签: ios xcode animation core-animation ios-simulator

我想以编程方式检测模拟器中是否打开或关闭慢动画。

这样的东西会很方便。

IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()

这仅用于开发目的。

4 个答案:

答案 0 :(得分:8)

幸运的是,这很简单:

float UIAnimationDragCoefficient(void);

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

答案 1 :(得分:4)

不幸的是,这并不容易。有关如何在模拟器中制作慢速CAAnimations,请查看this code 0xced

答案 2 :(得分: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而不是CGFloat作为被调用UIAnimationDragCoefficient()函数的返回类型。这需要与64位模拟器一起使用。

然后我可以简单地将动画持续时间相乘:

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

答案 3 :(得分:2)

如何在Swift 3.0中执行此操作:

TARGET_IPHONE_SIMULATOR

请注意,遗憾的是,您无法在Swift的编译时使用firstDayOfWeek(),并且您不应将其包含在App Store提交中,因为您可能因使用私有API而被拒绝。