2

アプリで UIPinchGestureRecognizer を使用してビューを拡大しています (そうです、UIScrollView を使用していないのには理由があります)。指で外側にピンチすると、期待どおりにビューがズームインし、画面から指を離さずにピンチを逆にすると、右にもズームします。ただし、内側にピンチしてズームを開始すると、ビューのズーム速度が劇的に遅くなります。これは、UIPinchGestureRecognizer の動作が原因であると推測しています。UIPinchGestureRecognizer のスケールは、外側にピンチすると >1 になり、内側にピンチすると <1 になります。残念ながら、これをコードに正確に反映する方法がわかりません。

- (IBAction)didDetectPinchGesture:(id)sender {
    UIPinchGestureRecognizer *gestureRecognizer = (UIPinchGestureRecognizer *)sender;

    CGFloat scale = [gestureRecognizer scale];

    switch ([gestureRecognizer state]) {
        case UIGestureRecognizerStateBegan:
            _lastScale = [gestureRecognizer scale];
            break;

        case UIGestureRecognizerStateChanged:

            CGFloat currentScale = [[self.imageView.layer valueForKeyPath:@"transform.scale"] floatValue];

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

            CGFloat newScale = 1 -  (_lastScale - scale); // new scale is in the range (0-1)
            newScale = MIN(newScale, kMaxScale / currentScale);
            newScale = MAX(newScale, kMinScale / currentScale);

            NSLog(@"%f", newScale);

            CGAffineTransform transform = CGAffineTransformScale([self.imageView transform], newScale, newScale);
            self.imageView.transform = transform;

            _lastScale = scale;  // Store the previous scale factor for the next pinch gesture call
            break;

        default:
            _lastScale = [gestureRecognizer scale];
            break;
    }
}
4

1 に答える 1

-1

gestureRecognizer scaleこれに対する非常に簡単な解決策は、終了時に back を 1 にリセットすることです。

    ...
    default:
        _lastScale = [gestureRecognizer scale];
        // Add this:
        [gestureRecognizer setScale:1];
        break;
    }
于 2014-03-05T07:39:48.310 に答える