在代码中检测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模拟器中慢速动画是不是打开/关闭的主要内容,如果未能解决你的问题,请参考以下文章