13

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

像这样的东西会很方便。

IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()

这仅用于开发目的。

4

4 回答 4

9

Fortunately it's easy:

float UIAnimationDragCoefficient(void);

static inline BOOL slowAnimationsEnabled()
{
#if TARGET_IPHONE_SIMULATOR
    return UIAnimationDragCoefficient() != 1;
#else
    return NO;
#endif
}
于 2012-11-09T11:58:22.867 回答
4

不幸的是,这并不容易。查看0xced的这段代码,了解如何在模拟器中制作慢速 CAAnimations。

于 2012-11-07T22:44:36.107 回答
3

如何在 Swift 3.0 中做到这一点:

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

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

请注意,不幸的是,您不能TARGET_IPHONE_SIMULATOR在 Swift 中在编译时使用,并且您不应将其包含在您的 App Store 提交中,因为您可能会因使用私有 API 而被拒绝。

于 2016-11-07T21:08:12.533 回答
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();
于 2015-05-19T10:51:41.553 回答