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