Domanda

Ci sono problemi noti con riconoscitori gesto e i metodi della classe UIView per l'animazione?

Sto avendo problemi con una sequenza di animazioni su un'UIImageView da UIGestureRecognizer callback. Se la sequenza di animazioni viene avviato da un callback standard come TouchUpInside, l'animazione funziona bene. Se viene avviato tramite l'UILongPressGestureRecognizer, poi la prima animazione salta fino alla fine e la seconda animazione inizia immediatamente.

Ecco un esempio che illustra il mio problema. Nel .xib per il progetto, ho un UIImageView che è collegato al viewToMove IBOutlet. Ho anche un'UIButton collegato al startButton IBOutlet, e ho collegato sua azione TouchUpInside al startButtonClicked IBAction. L'azione TouchUpInside funziona come lo voglio, ma il longPressGestureRecognizer salta alla fine della prima animazione, dopo circa mezzo secondo. Quando ho NSLog la seconda animazione (animateTo200) vedo che viene chiamato due volte quando una lunga pressione avvia l'animazione, ma solo una volta quando l'azione TouchUpInside del pulsante inizia l'animazione.

- (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];          
}
È stato utile?

Soluzione

Si dovrebbe cambiare la firma di startButtonClicked per - (void)startButtonClicked:(UIGestureRegognizer *)gestureRecognizer e poi interrogare proprietà state del riconoscitore gesto nel metodo. Il riconoscimento gesto chiamerà sue molteplici volte Metodo azione con diversi stati (ad esempio UIGestureRecognizerStateBegan e UIGestureRecognizerStateEnded).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top