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

Posted

技术标签:

【中文标题】在代码中检测iOS模拟器中慢速动画是不是打开/关闭【英文标题】:Detect if slow animations is on / off in iOS Simulator in code在代码中检测iOS模拟器中慢速动画是否打开/关闭 【发布时间】:2012-11-07 17:49:00 【问题描述】:

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

这样的东西会很方便。

IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()

这仅用于开发目的。

【问题讨论】:

【参考方案1】:

幸运的是,这很容易:

float UIAnimationDragCoefficient(void);

static inline BOOL slowAnimationsEnabled()

#if TARGET_IPHONE_SIMULATOR
    return UIAnimationDragCoefficient() != 1;
#else
    return NO;
#endif

【讨论】:

哇。我不知道那个! 不幸的是,Apple 在 ios 7 中打破了它。 Christian,它仍然适用于 iOS 8。请参阅我的解决方案,它也适用于 64 位。 @OrtwinGentz 感谢您报告 64 位不兼容问题。固定。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

好吧,那么这是使用私有 API。你的应用可能会在应用商店被拒绝,对吗? 是的,你不应该在你的代码中为应用商店构建这个(但是你不应该在应用商店中需要这个)。我的建议是在单独的构建目标上使用它并定义一个自定义 Swift 标志,在为商店构建时不会包含它。【参考方案4】:

我定义了这个函数,它返回乘以动画持续时间的因子(如果禁用慢速动画,则为 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();

【讨论】:

以上是关于在代码中检测iOS模拟器中慢速动画是不是打开/关闭的主要内容,如果未能解决你的问题,请参考以下文章

Instruments(性能调优 12.3)

检测 iOS 应用程序是不是在调试器中运行

如何检测 iOS 设备是不是处于静音模式?

模拟本地主机上的慢速连接

Android 检测设备是不是为模拟器

打开和关闭窗体动画