问题:我在 View Controller 上有一个捏合手势识别器,我用它来缩放嵌套在 View Controller 内的图像。下面的变换效果很好,只是图像是从左上角而不是中心缩放的。我希望它从中心开始缩放。
设置:
- 将 UIImageView 设置为宽高比填充模式(嵌套在几个 View 中,原点设置为中心)。
- 容器 View Controller 上的 UIPinchGestureRecognizer
我已验证:
- ImageView 的 anchor 为 (0.5, 0.5)
- 每次变换后中心都会移动
- View 或其父级没有自动布局约束(至少在构建时)
此外,我尝试在变换后设置 UIImageView 的中心,直到用户完成捏合后更改才会生效。
我不想将图像置于触摸中心,因为图像比 View Controller 小。
CGFloat _lastScale = 1.0;
- (IBAction)pinch:(UIPinchGestureRecognizer *)sender {
if ([sender state] == UIGestureRecognizerStateBegan) {
_lastScale = 1.0;
}
CGFloat scale = 1.0 - (_lastScale - [sender scale]);
_lastScale = [sender scale];
CGAffineTransform currentTransform = self.imageView.transform;
CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
[self.imageView setTransform:newTransform];
NSLog(@"center: %@", NSStringFromCGPoint(self.imageView.center));
}
这是一个演示该问题的完整项目。 https://github.com/adamloving/PinchDemo
最佳答案
no auto layout constraints on the view or its parent (at least at build time)
如果您的 Nib / Storyboard使用自动布局,那么肯定存在自动布局约束,即使您没有刻意构造它们。让我们面对现实吧,自动布局与 View 变换不能很好地配合。缩放变换应该从中心缩放,但是自动布局会与您作对,迫使框架重置其顶部和左侧(因为那是约束所在)。
请参阅我关于此主题的文章:
How do I adjust the anchor point of a CALayer, when Auto Layout is being used?
另请参阅discussion of this problem in my book .
就您而言,最简单的解决方案可能是将变换应用于 View 的层而不是 View 本身。换句话说,不要说这样的话:
self.v.transform = CGAffineTransformMakeScale(1.3, 1.3);
说这样的话:
self.v.layer.transform = CATransform3DMakeScale(1.3, 1.3, 1);
关于ios - UIPinchGestureRecognizer 变换未从中心调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20938338/