问题:我在视图控制器上有一个捏手势识别器,我用它来缩放嵌套在视图控制器内的图像。下面的转换工作正常,除了图像从左上角而不是中心缩放。我希望它从中心扩展。
设定:
我确认:
另外,我尝试在转换后设置UIImageView的中心,直到用户完成捏合后更改才会生效。
我不想将图像置于触控中心,因为图像小于视图控制器。
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
答案 0 :(得分:2)
视图或其父级没有自动布局约束(至少在构建时)
如果您的笔尖/故事板使用自动布局,那么即使您没有刻意构建它们,也肯定存在自动布局约束。让我们面对现实,自动布局与视图转换不能很好地配合。缩放变换应从中心开始缩放,但是自动布局会对您不利,迫使帧由其顶部和左侧重置(因为这是约束的位置)。
在这里查看我关于这个主题的文章:
How do I adjust the anchor point of a CALayer, when Auto Layout is being used?
另请参阅discussion of this problem in my book。
在您的情况下,最简单的解决方案可能是将变换应用于视图的图层而不是视图本身。换句话说,而不是说这种事:
self.v.transform = CGAffineTransformMakeScale(1.3, 1.3);
说出这样的话:
self.v.layer.transform = CATransform3DMakeScale(1.3, 1.3, 1);