我想以編程方式檢測模擬器中是否打開或關閉慢動畫。檢測在iOS模擬器中是否開啓/關閉慢動畫,代碼爲
這樣的事情會很方便。
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
這僅用於開發目的。
我想以編程方式檢測模擬器中是否打開或關閉慢動畫。檢測在iOS模擬器中是否開啓/關閉慢動畫,代碼爲
這樣的事情會很方便。
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
這僅用於開發目的。
幸好它很簡單:
float UIAnimationDragCoefficient(void);
static inline BOOL slowAnimationsEnabled()
{
#if TARGET_IPHONE_SIMULATOR
return UIAnimationDragCoefficient() != 1;
#else
return NO;
#endif
}
我定義這個函數,返回係數乘以動畫的持續時間與(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.0:
@_silgen_name("UIAnimationDragCoefficient") func UIAnimationDragCoefficient() -> Float
func slowAnimationsEnabled() -> Bool {
return UIAnimationDragCoefficient() != 1.0
}
注意,可惜你不能在斯威夫特編譯時使用TARGET_IPHONE_SIMULATOR
,你不應該在你的App Store提交中包含這個,因爲你可能會因爲使用私有API而被拒絕。
哇。我不知道那個! –
不幸的是,蘋果在iOS 7中破解了它。 –
基督徒,它仍然在iOS 8中工作。看到我的解決方案,也適用於64位。 –