【问题标题】:iOS - Pinch to zoom - using CGAffineTransform - to a PointiOS - 捏缩放 - 使用 CGAffineTransform - 到一个点
【发布时间】:2013-07-01 18:17:00
【问题描述】:
我有一个 UIViewController 正在调用 UIView 类,我正在使用 CGAffine Transform 使用以下代码放大我的 UIView 类实例
CGAffineTransform transform = CGAffineTransformMakeScale(recognizer.scale, recognizer.scale);
NSLog(@"Pinch scale: %f", recognizer.scale);
float scale = recognizer.scale;
float SCALE_MIN = 1.0f;
float SCALE_MAX = 3.0f;
. . .
此基本代码有效! (部分代码已省略)
现在的问题是无论我在屏幕上的哪个位置“捏”文件总是从文件的中间缩放,而不是在我捏的位置。 .
关于如何让它放大到被夹的确切位置有什么建议吗?
【问题讨论】:
标签:
ios
objective-c
zooming
uigesturerecognizer
cgaffinetransform
【解决方案1】:
- (void)pinchDetected:(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.2;
const CGFloat kMinScale = 0.64;
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;
[gestureRecognizer setScale:1.0];
lastScale = [gestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call
}
}
【解决方案2】:
希望这对你有帮助,它对我来说就像一个魅力......
- (void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer
{
CGAffineTransform transform = CGAffineTransformScale(pinchRecognizer.view.transform, pinchRecognizer.scale,pinchRecognizer.scale);
_designImage.transform = transform;
_Zoomscale = pinchRecognizer.scale;
NSLog(@"image Pinch scale: %2ff", _Zoomscale);
}
【解决方案3】:
locationInView: 方法在所有UIGestureRecognizers 上都可用,当在UIPinchGestureRecognizer 的实例上调用时,它将为您提供构成夹点的两次触摸之间的中点。这是我认为你会得到的最接近“精确位置”的东西。
首次识别手势时,保存locationInView 以获取您要缩放的点。我不会尝试在捏合过程中更新缩放中心,因为我认为您最终会得到一个不直观的复杂实现。您将希望缩放保持该中心点固定,并且您应该能够通过设置您正在转换的视图的layer 的anchorPoint 来做到这一点。注意anchorPoint坐标是标准化的---默认是(0.5, 0.5),视图的中心。