UIPinchGestureRecognizer的最大/最小缩放比例 - iPhone iOS

Vin*_*nyD 42 iphone cgaffinetransform ipad ios

我怎样才能将UIPinchGestureRecognizer的比例限制在最小和最大水平?下面的scale属性似乎是相对于上一个已知的比例(来自上一个状态的delta),我无法弄清楚如何设置对被缩放对象的大小/高度的限制.

-(void)scale:(id)sender {

[self.view bringSubviewToFront:[(UIPinchGestureRecognizer*)sender view]];

if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
    lastScale = 1.0;
    return;
}

CGFloat pinchscale = [(UIPinchGestureRecognizer*)sender scale];
CGFloat scale = 1.0 - (lastScale - pinchscale);
CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
CGAffineTransform holderTransform = holderView.transform;
CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
[[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];

lastScale = [(UIPinchGestureRecognizer*)sender scale];
Run Code Online (Sandbox Code Playgroud)

}

Pau*_*olt 108

这是我在使用Anomie的答案作为起点后想出的解决方案.

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer {

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = [gestureRecognizer scale];
    }

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

        // Constants to adjust the max/min values of zoom
        const CGFloat kMaxScale = 2.0;
        const CGFloat kMinScale = 1.0;

        CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]); 
        newScale = MIN(newScale, kMaxScale / currentScale);   
        newScale = MAX(newScale, kMinScale / currentScale);
        CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
        [gestureRecognizer view].transform = transform;

        lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call  
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好方案!我一直在寻找这个!为什么它不在这个问题的顶端!?谢谢 (2认同)
  • 谢谢 !- 谢谢 ! - 谢谢!....:d (2认同)

Ano*_*mie 18

没有办法限制a的规模UIPinchGestureRecognizer.要限制代码中的高度,您应该可以执行以下操作:

CGFloat scale = 1.0 - (lastScale - pinchscale);
CGRect bounds = [(UIPinchGestureRecognizer*)sender view].bounds;
scale = MIN(scale, maximumHeight / CGRectGetHeight(bounds));
scale = MAX(scale, minimumHeight / CGRectGetHeight(bounds));
Run Code Online (Sandbox Code Playgroud)

要限制宽度,请在最后两行中将"高度"更改为"宽度".