2013-03-25 3 views
2

Скажите, что приложение имеет две кнопки, и каждая из них запускает анимацию (например, push или другую стандартную сегу или пользовательскую анимацию). Как вы останавливаете обе анимации одновременно, если пользователь нажимает обе кнопки «сразу»? Ну, сначала я попробовал:Как я могу убедиться, что только одно действие выполняется в ответ на ввод пользователя?

[[viewController view] setUserInteractionEnabled:NO]; 

Но это не исправить проблему. (Может быть, userInteractionEnabled не каскадно подобозрения сразу?)

Тогда я попробовал:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

Что же решить эту проблему, кроме если нажать обе кнопки очень быстро, один за другим (в основном нажмите оба одновременно, используя 2 пальца), затем вы получаете обе анимации, которые вызывают проблемы для моего приложения. Возможно, оба события уже срабатывали до того, как мой код запускает -beginIgnoringInteractionEvents?

Что такое надежный способ немедленно остановить любые другие события крана? Или флеши, которые уже начались. У меня есть эта проблема по всему моему приложению - нажатие двух кнопок (или нажатие на ячейки таблицы и т. Д.) Очень быстро вызывает два события и искажает анимацию.

Любые идеи? Что люди делают с этой проблемой в приложениях iOS?

+0

Почему вы не добавляете свойство like isAnimating и не проверяете его состояние после нажатия кнопки и перед вашей анимацией? –

+0

, когда нажимаете на кнопку check, есть ли какая-либо анимация, если анимация найдена, остановите ее и запустите новую анимацию. – Balu

+0

Спасибо за ваш быстрый ответ, но у меня много анимаций по всему моему приложению, включая стандартные push/pop segues и т. Д. Поэтому мне нужно было бы иметь какое-то глобальное свойство AAimating и даже устанавливать его во время всех моих стандартных отступлений! (что трудно сделать, поскольку оно должно быть отменено по завершении анимации). Должен быть лучший способ? – Bbx

ответ

1

Управление сенсорным управлением выполняется асинхронно в iOS, чтобы убедиться, что устройство реагирует. Это означает, что обработчики могут быть поставлены в очередь перед запуском, что является причиной того, что ваш вызов beginIgnoringInteractionEvents игнорируется.

Самое простое решение - просто создать глобальную переменную, чтобы сделать взаимодействие эксклюзивным.

@interface UIApplicaiton(AnimationsInProgress) 

- (BOOL)isAnimationInProgress; 
- (void)setAnimationInProgress:(BOOL)value; 

@end 

И реализация:

@implementation UIApplication(AnimationsInProgress) 
{ 
    BOOL _isAnimationInProgress; 
} 

- (BOOL)isAnimationInProgress { 
    return _isAnimationInProgress; 
} 

- (void)setAnimationInProgress:(BOOL)value { 
    _isAnimationInProgress = value; 
} 

Используйте это почти, как вы бы beginIgnoringInteractionEvents, в верхней части вашей анимации действий:

if ([[UIApplication sharedApplication] isAnimationInProgress) 
    return; 
[[UIApplication sharedApplication] setAnimationInProgress:YES]; 

[UIView animate .... completion:^{ 
    [[UIApplication sharedApplication] setAnimationInProgress:NO]; 
}]; 

Как нет расы условие, как с события касания и beginIgnoringInteractionEvents, это будет работать для вашей цели.

+0

ОК, это полезно спасибо. Но как насчет стандартных iOS-сеггов. Думаю, я мог бы перехватить prepareForSegue и вызвать setAnimationInProgress, но нет простого и надежного способа узнать, когда segue закончен, я не думаю. – Bbx

+0

+1, но делать это вручную во всем приложении - безумие. – zoul

+0

Для segues следите за ним в самом контроллере представления, задайте состояние boolean в 'prepareForSegue' и сбросьте его в' viewDidAppear'. –

Смежные вопросы