1

iOS 10.2 斯威夫特 3.0

试图从 Paul Solt 博客翻译这段代码。由 SO 海报修复,更新代码!

http://paulsolt.com/blog/2011/03/limiting-uipinchgesturerecognizer-zoom-levels

示例代码

- (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]); // new     scale is in the range (0-1)
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
}
}

几乎完成了,但似乎找不到对此处用于 Swift 3.0 的 CATransform 键的引用。我的代码...

if sender.state == .began {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = sender.scale
    }

    if sender.state == .began || sender.state == .changed {

        // UPDATED
        currentScaleX = self.image2P.transform.scaleX
        currentScaleY = self.image2P.transform.scaleY


        self.image2P.transform = self.image2P.transform.scaledBy(x: 1.1, y: 1.1)


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

        var newScale = 1 -  (lastScale - sender.scale) // new scale is in the range (0-1)
        newScale = min(newScale, kMaxScale / currentScaleX)
        newScale = max(newScale, kMinScale / currentScaleY)
        self.image2P.transform = self.image2P.transform.scaledBy(x: newScale, y: newScale)

        lastScale = sender.scale  // Store the previous scale factor for the next pinch gesture call
    }
4

1 回答 1

1

您应该单独存储xScale和存储,yScale因为一般来说不能保证它们是相等的。

extension CGAffineTransform {
    var scaleX: CGFloat {
        return (a > 0 ? 1 : -1) * sqrt (a*a + c*c)
    }

    var scaleY: CGFloat {
        return (d > 0 ? 1 : -1) * sqrt (b*b + d*d)
    }
}

即使您的视图也被旋转和/或平移,这些扩展方法也将返回正确的比例因子:

view.transform = CGAffineTransform(scaleX: 1.5, y: 1.2).rotated(by: .pi/3.0).translatedBy(x: 50, y: 30)
print("scaleX = \(view.transform.scaleX), scaleY = \(view.transform.scaleY)")

输出:

scaleX = 1.5, scaleY = 1.2

这可能并不明显,但、 和a属性b是矩阵的元素。您可以在Quartz 2D 编程指南中找到更多详细信息。你也可以在这里找到数学细节。请注意,元素名称在这两个源中交换。cdtransformbc

于 2017-02-16T10:45:40.190 回答