4

ピンチ/ズーム機能を次のように機能させることができます。

- (void)twoFingerPinch:(UIPinchGestureRecognizer *)recognizer
{

    if([recognizer state] == UIGestureRecognizerStateBegan) {
        _lastScale = 1.0;
    }

    CGFloat scale = 1.0 - (_lastScale - [recognizer scale]);

    CGAffineTransform currentTransform = self.imageForEditing.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

    [self.imageForEditing setTransform:newTransform];

    _lastScale = [recognizer scale];


}

問題は、画像が中心に基づいてズームされるため、最初に画像をパンして中心に配置されないようにしてからピンチ/ズームすると、タッチ間の領域にズームしません。これは対処され解決された一般的な問題であるに違いないと思いますが、解決策を見つけることができませんでした.

4

3 に答える 3

3
@objc private func pinchHandler(gesture: UIPinchGestureRecognizer) {
    if let view = gesture.view {

        switch gesture.state {
        case .changed:
            let pinchCenter = CGPoint(x: gesture.location(in: view).x - view.bounds.midX,
                                      y: gesture.location(in: view).y - view.bounds.midY)
            let transform = view.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y)
                                            .scaledBy(x: gesture.scale, y: gesture.scale)
                                            .translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
            view.transform = transform
            gesture.scale = 1
        case .ended:
            // Nice animation to scale down when releasing the pinch.
            // OPTIONAL
            UIView.animate(withDuration: 0.2, animations: {
                view.transform = CGAffineTransform.identity
            })
        default:
            return
        }


    }
}
于 2017-05-09T13:39:14.973 に答える
1

レイヤーのアンカーポイントを 2 つのピンチタッチの「中心」に設定できます。

- (void)twoFingerPinch:(UIPinchGestureRecognizer *)recognizer
{

    if([recognizer state] == UIGestureRecognizerStateBegan) {
        _lastScale = 1.0;
        if ([recognizer numberOfTouches] >= 2) { //should always be true when using a PinchGR
            CGPoint touch1 = [recognizer locationOfTouch:0 inView:self.imageForEditing];
            CGPoint touch2 = [recognizer locationOfTouch:1 inView:self.imageForEditing];
            CGPoint mid;
            mid.x = ((touch2.x - touch1.x) / 2) + touch1.x;
            mid.y = ((touch2.y - touch1.y) / 2) + touch1.y;
            CGSize imageViewSize = self.imageForEditing.frame.size;
            CGPoint anchor;
            anchor.x = mid.x / imageViewSize.width;
            anchor.y = mid.y / imageViewSize.height;
            self.imageForEditing.layer.anchorPoint = anchor;
        }
    }

    CGFloat scale = 1.0 - (_lastScale - [recognizer scale]);

    CGAffineTransform currentTransform = self.imageForEditing.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

    [self.imageForEditing setTransform:newTransform];

    _lastScale = [recognizer scale];


}

そうすれば、画像は 2 つのタッチ間の中心に対して相対的に拡大縮小する必要があります。

詳細については、Core Animation Programming Guide - Core Animation Basicsを参照してください。

于 2013-04-20T11:27:32.120 に答える
0

以下のコードを試して、ピンチ ジェスチャー レコグナイザーを使用してズーム イン/アウトし、ビューの中心を移動してください。このコードを UIGestureRecognizerStateBegan に挿入します。

        previousTouchPoint = [pinchRecognizer locationInView:self.view];

そしてこれはあなたのUIGestureRecognizerStateChangedにあります:

       //zoom in/out view based on scale
        CGFloat zoomScale = pinchRecognizer.scale;
        CGRect tRect = pinchedView.bounds;
        tRect.size.width = pinchedView.frame.size.width * zoomScale;
        tRect.size.height = pinchedView.frame.size.height * zoomScale;
        pinchedView.bounds = tRect;

        //sets the center of view
        CGPoint currentTouchPoint = [pinchRecognizer locationInView:self.view];
        CGPoint tCenter = pinchedView.center;
        tCenter.x -= (previousTouchPoint.x - currentTouchPoint.x);
        tCenter.y -= (previousTouchPoint.y - currentTouchPoint.y);
        pinchedView.center = tCenter;
        previousTouchPoint = [pinchRecognizer locationInView:self.view];
于 2013-12-06T05:53:56.257 に答える