ios - UIPinchGestureRecognizer 变换未从中心调整大小

标签 ios uiimageview

问题:我在 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/

相关文章:

ios - 如何检查 NSData 在 UIImage 中的使用是否有效

ios - 从 APP Store 上的应用程序中检索代码

iOS文本框光标位置错误

ios - UIImageView发生触摸事件时跳转

iphone - 从 UIImageView 获取像素数据——适用于模拟器,不适用于设备

ios - 在 iOS 中旋转或缩放后图像的确切大小和位置

ios - 从中心点调整 UIImageView 的大小

ios - 我的网址没有响应

ios - 具有自动更新当前时区的静态让日历不起作用

ios - 无法使用 .xib 文件在我的自定义单元格中添加任何内容?