0

手勢識別器和用於動畫的UIView類方法是否存在已知問題?iPhone SDK 3.2 UIGestureRecognizer干擾UIView動畫?

我在從UIGestureRecognizer回調的UIImageView上的動畫序列有問題。如果動畫序列是從TouchUpInside等標準回調開始的,則動畫可以正常工作。如果它是通過UILongPressGestureRecognizer啓動的,那麼第一個動畫跳轉到結尾,第二個動畫立即開始。

下面是一個示例,說明我的問題。在項目的.xib中,我有一個連接到viewToMove IBOutlet的UIImageView。我也有一個連接到startButton IBOutlet的UIButton,並且我已經將它的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財產。手勢識別器將使用不同的狀態多次調用其動作方法(例如,UIGestureRecognizerStateBeganUIGestureRecognizerStateEnded)。

+2

注意:請務必編輯該操作:'@selector(startButtonClicked:)'。那麼需要冒號。 – bddckr 2010-04-23 20:41:39

+0

感謝這兩個。這解決了我的問題。下次需要更仔細地閱讀文檔。 – 2010-04-23 22:29:59