0

Известны ли проблемы с распознавателями жестов и методами класса UIView для анимации?iPhone SDK 3.2 UIGestureRecognizer мешает анимации UIView?

У меня возникли проблемы с последовательностью анимаций на UIImageView из обратного вызова UIGestureRecognizer. Если последовательность анимаций запускается со стандартного обратного вызова, такого как TouchUpInside, анимация работает нормально. Если он запускается через UILongPressGestureRecognizer, тогда первая анимация переходит в конец, и сразу начинается вторая анимация.

Вот пример, который иллюстрирует мою проблему. В .xib для проекта у меня есть UIImageView, который подключен к viewToMove IBOutlet. У меня также есть UIButton, подключенный к IBOutlet startButton, и я связал его действие TouchUpInside с startButtonClicked IBAction. Действие TouchUpInside работает так, как я хочу, но longPressGestureRecognizer пропускает до конца первой анимации примерно через полсекунды. Когда я NSLog второй анимации (animateTo200), я вижу, что он вызывается дважды, когда длинное нажатие запускает анимацию, но только один раз, когда действие кнопки TouchUpInside кнопки запускает анимацию.

- (void)viewDidLoad { 
[super viewDidLoad]; 

UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(startButtonClicked)]; 
NSArray *recognizerArray = [[NSArray alloc] initWithObjects:longPressRecognizer, nil]; 
[startButton setGestureRecognizers:recognizerArray]; 

[longPressRecognizer release]; 
[recognizerArray release]; 
} 

-(IBAction)startButtonClicked { 

if (viewToMove.center.x < 150) { 
    [self animateTo200:@"Right to left" finished:nil context:nil]; 
} else { 
    [self animateTo100:@"Right to left" finished:nil context:nil]; 
} 
} 

-(void)animateTo100:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
[UIView beginAnimations:@"Right to left" context:nil]; 
[UIView setAnimationDuration:4]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animateTo200:finished:context:)]; 
viewToMove.center = CGPointMake(100.0, 100.0); 
[UIView commitAnimations];   
} 

-(void)animateTo200:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
[UIView beginAnimations:@"Left to right" context:nil]; 
[UIView setAnimationDuration:4]; 
viewToMove.center = CGPointMake(200.0, 200.0); 
[UIView commitAnimations];   
} 

ответ

4

Вы должны изменить подпись startButtonClicked к - (void)startButtonClicked:(UIGestureRegognizer *)gestureRecognizer, а затем запросить state свойство жест распознаватель в методе. Устройство распознавания жестов будет вызывать его действие несколько раз с различными состояниями (например, UIGestureRecognizerStateBegan и UIGestureRecognizerStateEnded).

+2

Примечание: обязательно отредактируйте действие: '@selector (startButtonClicked:)'. Тогда нужна двоеточие. – bddckr

+0

Благодаря обоим. Это решило мою проблему. В следующий раз нужно внимательно прочитать документы. –

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