0

ジェスチャ レコグナイザーとアニメーションの UIView クラス メソッドに関する既知の問題はありますか?

UIGestureRecognizer コールバックからの UIImageView の一連のアニメーションに問題があります。アニメーションのシーケンスが TouchUpInside のような標準のコールバックから開始される場合、アニメーションは正常に機能します。UILongPressGestureRecognizer を介して開始された場合、最初のアニメーションが最後にジャンプし、2 番目のアニメーションがすぐに開始されます。

これが私の問題を示すサンプルです。プロジェクトの .xib には、viewToMove IBOutlet に接続された UIImageView があります。また、UIButton を startButton IBOutlet に接続し、その TouchUpInside アクションを startButtonClicked IBAction に接続しました。TouchUpInside アクションは思い通りに動作しますが、longPressGestureRecognizer は約 0.5 秒後に最初のアニメーションの最後までスキップします。2 番目のアニメーション (animateTo200) を NSLog すると、長押しでアニメーションが開始されたときに 2 回呼び出されますが、ボタンの TouchUpInside アクションでアニメーションが開始されたときに 1 回だけ呼び出されることがわかります。

- (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

1 に答える 1

4

の署名を変更してstartButtonClickedから、メソッドで- (void)startButtonClicked:(UIGestureRegognizer *)gestureRecognizerジェスチャ認識機能のstateプロパティをクエリする必要があります。ジェスチャレコグナイザは、そのアクションメソッドをさまざまな状態(UIGestureRecognizerStateBeganおよびUIGestureRecognizerStateEnded)で複数回呼び出します。

于 2010-04-23T20:31:53.730 に答える