2012-11-07 61 views

回答

7

幸好它很簡單:

float UIAnimationDragCoefficient(void); 

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

哇。我不知道那個! –

+0

不幸的是,蘋果在iOS 7中破解了它。 –

+0

基督徒,它仍然在iOS 8中工作。看到我的解決方案,也適用於64位。 –

4

不幸的是,這並不容易。看看this code0xced爲如何在模擬器中製作緩慢的CAAnimations。

+0

哇!令人興奮的東西! – hfossli

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(); 
1

如何做到這一點的雨燕3.0:

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

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

注意,可惜你不能在斯威夫特編譯時使用TARGET_IPHONE_SIMULATOR,你不應該在你的App Store提交中包含這個,因爲你可能會因爲使用私有API而被拒絕。

+0

那麼,這是使用私人API。您的應用可能會在應用商店被拒絕,對嗎? – hfossli

+1

是的,你不應該在你的代碼中爲這個應用商店構建這個應用商店(但是你根本不需要這個應用商店)。我的建議是在一個單獨的構建目標上使用它,並定義一個自定義的Swift標誌,該標誌在構建商店時不會包含此標誌。 – stu