Ответ 1
К счастью, это легко:
float UIAnimationDragCoefficient(void);
static inline BOOL slowAnimationsEnabled()
{
#if TARGET_IPHONE_SIMULATOR
return UIAnimationDragCoefficient() != 1;
#else
return NO;
#endif
}
Я хочу программно определить, включена или выключена медленная анимация в симуляторе.
Что-то вроде этого было бы удобно.
IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()
Это только для целей развития.
К счастью, это легко:
float UIAnimationDragCoefficient(void);
static inline BOOL slowAnimationsEnabled()
{
#if TARGET_IPHONE_SIMULATOR
return UIAnimationDragCoefficient() != 1;
#else
return NO;
#endif
}
К сожалению, это не так просто. Посмотрите этот код 0xced за то, как сделать медленные CAAnimations в симуляторе.
Я определил эту функцию, которая возвращает множитель, чтобы умножить длительность анимации с (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();
Как это сделать в Swift 3.0:
@_silgen_name("UIAnimationDragCoefficient") func UIAnimationDragCoefficient() -> Float
func slowAnimationsEnabled() -> Bool {
return UIAnimationDragCoefficient() != 1.0
}
Обратите внимание: к сожалению, вы не можете использовать TARGET_IPHONE_SIMULATOR
во время компиляции в Swift, и вы не должны включать это в свои приложения в App Store, поскольку вы можете отказаться от использования частных API.