UIPinchGestureRecognizer转换不从中心调整大小

时间:2014-01-05 19:51:00

标签: ios uiimageview

问题:我在视图控制器上有一个捏手势识别器,我用它来缩放嵌套在视图控制器内的图像。下面的转换工作正常,除了图像从左上角而不是中心缩放。我希望它从中心扩展。

设定:

  • 将UIImageView设置为Aspect Fill模式(嵌套在几个视图中,原点设置为center)。
  • 容器View Controller上的UIPinchGestureRecognizer

我确认:

  • 用于图像视图的anchorPoint是(0.5,0.5)
  • 每次转换后中心都在移动
  • 视图或其父级(至少在构建时)没有自动布局约束

另外,我尝试在转换后设置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

1 个答案:

答案 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);