Подтвердить что ты не робот

Обнаружение, если медленная анимация включена/выключена в iOS Simulator в коде

Я хочу программно определить, включена или выключена медленная анимация в симуляторе.

Что-то вроде этого было бы удобно.

IPHONE_SIMULATOR_SLOW_ANIMATIONS_ENABLED()

Это только для целей развития.

4b9b3361

Ответ 1

К счастью, это легко:

float UIAnimationDragCoefficient(void);

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

Ответ 2

К сожалению, это не так просто. Посмотрите этот код 0xced за то, как сделать медленные CAAnimations в симуляторе.

Ответ 3

Я определил эту функцию, которая возвращает множитель, чтобы умножить длительность анимации с (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();

Ответ 4

Как это сделать в Swift 3.0:

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

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

Обратите внимание: к сожалению, вы не можете использовать TARGET_IPHONE_SIMULATOR во время компиляции в Swift, и вы не должны включать это в свои приложения в App Store, поскольку вы можете отказаться от использования частных API.