2011-02-09 59 views
12

我想在我的iPhone应用程序中处理旋转手势并在此期间旋转imageView。在手势结束时,我想旋转到固定位置imageView。 所以即,如果我将imageView从0弧度旋转到M_PI/2弧度,但在中途的某处我以手势结束。结束后,我想测试的角度,如果它M_PI接近/ 2,然后将其设置为M_PI/2,否则为0。
这里是我的代码,我如何试图做到这一点:UIGestureRecognizer结束

我创建并添加认识到我的看法。

UIGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)]; 
recognizer.delegate = self; 
[self addGestureRecognizer:recognizer]; 
[recognizer release]; 

委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if (_imageView) { 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

手势识别的方法:

- (void)gestureRecognized:(UIRotationGestureRecognizer *)recognizer { 
    _imageView.transform = CGAffineTransformMakeRotation(recognizer.rotation); 
} 

这些方法的工作,但在这里就是我试图让手势结束的方法。这是行不通的:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"gesture end"); 
} 

此外与变换我有一个小问题。有时它会回到0弧度。

任何建议是值得欢迎的。谢谢!

回答

25

我在其他论坛上找到了答案。我希望这也能帮助其他人。 答案:

您可以通过在操作方法中检查UIRotationGestureRecognizer的状态来检测手势的结束。如果[gestureRecognizer state] == UIGestureRecognizerStateEnded,那么就完成了。如果有东西导致它被取消(例如,一个电话进来),那么你会看到它在UIGestureRecognizerStateCancelled结束。

如果您想将识别器的旋转直接应用到您的视图,而不是将它视为以前位置的增量,您可以设置识别器的旋转状态为UIGestureRecognizerStateBegan,然后它将计算该值的偏移量,可以直接应用它们。这只需要记住上一次结束时的旋转,然后当识别器的状态为UIGestureRecognizerStateBegan时,您可以执行类似[gestureRecognizer setRotation:lastAppliedRotation]的操作。

1

如果gestureRecognizer识别到手势,默认情况下不会调用touchesEnded(touchesCancelled将被调用,touchesEnded只会在识别器无法识别手势时调用)。设置gestureRecognizer.delaysTouchesEndedNO,它应该工作。

+0

它不工作。你知道为什么吗?仍然没有收到结束。 – 2011-02-10 08:09:09

0

为了防止这种情况发生在您身上,并且您正在阅读该问题的原因: “已结束”和“已识别”是相同的值(3)。所以这个代码(在swift中)将不起作用:

if (gesture.state == .recognized || gesture.state == .changed) { 
} 
else if (gesture.state == .ended) { 
//do something else 
//=> never called 
}