2012-11-07 8 views

risposta

7

Fortunatamente è facile:

float UIAnimationDragCoefficient(void); 

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

Wow. Non sapevo di quello! –

+0

Sfortunatamente Apple l'ha rotto in iOS 7. –

+0

Christian, funziona ancora su iOS 8. Vedi la mia soluzione che funziona anche su 64 bit. –

4

Sfortunatamente non è così facile. Dai un'occhiata a this code per 0xced per come rendere le CAAnimations lente nel simulatore.

+0

Wow! Roba eccitante! – hfossli

2

ho definito questa funzione che restituisce il fattore di moltiplicare le durate di animazione con (1 se le animazioni lente sono disabilitate, il fattore lentezza altrimenti):

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; 
} 

Nota che io uso float, non CGFloat come tipo di ritorno della funzione chiamata UIAnimationDragCoefficient(). Questo è necessario per lavorare con il simulatore a 64 bit.

allora posso semplicemente moltiplicare la durata dell'animazione:

CAAnimation animation = [CABasicAnimation animation]; 
animation.duration = 0.5 * FTSimulatorAnimationDragCoefficient(); 
1

come fare questo a Swift 3.0:

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

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

Si noti che, purtroppo, non è possibile utilizzare TARGET_IPHONE_SIMULATOR al momento della compilazione a Swift, e non dovresti includerlo negli invii di App Store in quanto potresti essere rifiutato per l'utilizzo di API private.

+0

Bene, quindi si sta utilizzando l'API privata. La tua app potrebbe essere rifiutata nell'app store, ho ragione? – hfossli

+1

Sì, non dovresti creare per l'app store con questo nel tuo codice (non dovresti comunque averne bisogno per l'app store). Il mio suggerimento è di usarlo su un target di build separato e definire un flag Swift personalizzato che non includerà questo quando si costruisce per il negozio. – stu

Problemi correlati