UIPinchGestureRecognizer。 放大手指的位置,不仅中心

我可以使用UIPinchGestureRecognizerUIPinchGestureRecognizer的视图中进行UICollectionViewCell ,但是无论您开始制作UIPinch手势的位置如何,放大总是放在视图的中心。 例如,我想捏在视图的左上angular区域,并在我触摸屏幕的位置创build缩放。 但是,如果我这样做,缩放是在视图的中心创build。

这是我用来进行缩放的代码:

  if([gesture state] == UIGestureRecognizerStateBegan) { previousScale = 1.0; } if ( [gesture state] == UIGestureRecognizerStateChanged) { CGFloat currentScale = [[[gesture view].layer valueForKeyPath:@"transform.scale"] floatValue]; // Constants to adjust the max/min values of zoom const CGFloat kMaxScale = 4.0; const CGFloat kMinScale = 1.0; CGFloat newScale = 1 - (previousScale - [gesture scale]); // new scale is in the range (0-1) newScale = MIN(newScale, kMaxScale / currentScale); newScale = MAX(newScale, kMinScale / currentScale); scale = newScale; CGAffineTransform transform = CGAffineTransformScale([[gesture view] transform], newScale, newScale); [gesture view].transform = transform; [self.collectionView.collectionViewLayout invalidateLayout]; } 

那么我怎样才能selectUIPinchGesture的位置呢?

谢谢

你只是应用规模变换,这将始终保持视图在中心。 除了缩放之外,还必须根据发件人的locationInView执行翻译。 你可以用下面的代码replace上面的函数:

 - (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { lastScale = 1.0; lastPoint = [sender locationInView:self]; } // Scale CGFloat scale = 1.0 - (lastScale - sender.scale); [self.layer setAffineTransform: CGAffineTransformScale([self.layer affineTransform], scale, scale)]; lastScale = sender.scale; // Translate CGPoint point = [sender locationInView:self]; [self.layer setAffineTransform: CGAffineTransformTranslate([self.layer affineTransform], point.x - lastPoint.x, point.y - lastPoint.y)]; lastPoint = [sender locationInView:self]; } 

我做到了,这是我的最终代码:

 if([gesture state] == UIGestureRecognizerStateBegan) { previousScale = 1.0; lastPoint = [gesture locationInView:[gesture view]]; } if ( [gesture state] == UIGestureRecognizerStateChanged) { CGFloat currentScale = [[[gesture view].layer valueForKeyPath:@"transform.scale"] floatValue]; // Constants to adjust the max/min values of zoom const CGFloat kMaxScale = 4.0; const CGFloat kMinScale = 1.0; CGFloat newScale = 1 - (previousScale - [gesture scale]); // new scale is in the range (0-1) newScale = MIN(newScale, kMaxScale / currentScale); newScale = MAX(newScale, kMinScale / currentScale); scale = newScale; CGAffineTransform transform = CGAffineTransformScale([[gesture view] transform], newScale, newScale); [gesture view].transform = transform; CGPoint point = [gesture locationInView:[gesture view]]; CGAffineTransform transformTranslate = CGAffineTransformTranslate([[gesture view] transform], point.x-lastPoint.x, point.y-lastPoint.y); [gesture view].transform = transformTranslate; }