如何一次处理多个触摸手势?
我必须一次在我的imageview
上执行所有的手势,意味着用户可以在一次点击的同时移动imageview
,也可以缩放和旋转。现在我发现这种方法执行多个手势,但无法执行缩放轮替]。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
在应用UIPinchGestureRecognizer
, UIRotationGestureRecognizer
和UIPanGestureRecognizer
之前,它只能处理一个手势。请帮助我解决这个问题,或者给我任何其他更好的select,如果可能的话。
UIPinchGestureRecognizer *pinchGesture = ... //initialize pinchGesture.delegate = self; //same for rotation gesture //and then implement delegate method - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
像这样设置手势。
self.view.multipleTouchEnabled=YES; UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveViewWithGestureRecognizer:)]; panGestureRecognizer.delegate=self; [self.sub_View addGestureRecognizer:panGestureRecognizer]; UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotationWithGestureRecognizer:)]; rotationGestureRecognizer.delegate=self; [self.sub_View addGestureRecognizer:rotationGestureRecognizer]; UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchWithGestureRecognizer:)]; pinchGestureRecognizer.delegate=self; [self.sub_View addGestureRecognizer:pinchGestureRecognizer]; [self.imageView setUserInteractionEnabled:YES];
处理行动
-(void)handlePinchWithGestureRecognizer:(UIPinchGestureRecognizer *)pinchGestureRecognizer{ [self.superImage_View setAlpha:0.5]; if (pinchGestureRecognizer.state == UIGestureRecognizerStateEnded) { [self.superImage_View setAlpha:1.0]; } self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale); pinchGestureRecognizer.scale =1.0; } -(void)handleRotationWithGestureRecognizer:(UIRotationGestureRecognizer *)rotationGestureRecognizer{ [self.superImage_View setAlpha:0.5]; if (rotationGestureRecognizer.state == UIGestureRecognizerStateEnded) { [self.superImage_View setAlpha:1.0]; } self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotationGestureRecognizer.rotation); rotationGestureRecognizer.rotation = 0.0; } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } -(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer{ //CGPoint touchLocation = [panGestureRecognizer locationInView:self.sub_View]; // self.imageView.center = touchLocation; [self.superImage_View setAlpha:0.5]; CGPoint translation = [panGestureRecognizer translationInView:self.view]; self.imageView.center = CGPointMake(self.imageView.center.x + translation.x, self.imageView.center.y + translation.y); [panGestureRecognizer setTranslation:CGPointMake(0, 0) inView:self.view]; if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) { CGPoint velocity = [panGestureRecognizer velocityInView:self.view]; CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); CGFloat slideMult = magnitude / 200; // NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); float slideFactor = 0.1 * slideMult; // Increase for more of a slide CGPoint finalPoint = CGPointMake(self.imageView.center.x + (velocity.x * slideFactor), self.imageView.center.y + (velocity.y * slideFactor)); finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width); finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height); [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ self.imageView.center = finalPoint; } completion:nil]; [self.superImage_View setAlpha:1.0]; } }