【问题标题】:UIScrollView zoom removes transform from UIImageViewUIScrollView 缩放从 UIImageView 中移除变换
【发布时间】:2024-01-11 13:50:01
【问题描述】:

我有以下代码,允许用户通过按下按钮来旋转屏幕上的图像。

self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotationAmount);

此图像位于 UIScrollView 内,用户可以通过它放大照片。问题是当用户缩放时,变换被重置。我可以存储变换的值,然后在缩放后重新应用它,但图像看起来好像在旋转版本和非旋转版本之间弹跳。

有没有办法在缩放期间保持变换?

这是滚动视图的代码

self.scrollView.minimumZoomScale=1.0;
self.scrollView.maximumZoomScale=6.0;
self.scrollView.contentSize=CGSizeMake(screenHeight, screenWidth-toolBarHeight);
self.scrollView.delegate=self;
[_scrollView setContentMode:UIViewContentModeScaleAspectFit];
[_scrollView sizeToFit];
[_scrollView setContentSize:CGSizeMake(_imageView.frame.size.width, _imageView.frame.size.height)];

【问题讨论】:

  • 你能贴出放大照片的代码吗?

标签: ios objective-c uiscrollview uiimageview rotation


【解决方案1】:

我早就应该提出这个问题,而不是仅仅评论马特的回答,抱歉。

正如 Matt 所暗示的,UIScrollView 通过操纵其内容视图的 transform 属性来发挥它的魔力(缩放和平移)。如果您尝试在同一个 UIView 上操作 transform 属性,那么您将破坏 scrollView 的努力。您需要在视图层次结构中的不同级别应用旋转,考虑旋转 scrollView 本身。最好的

【讨论】:

    【解决方案2】:

    问题是当用户缩放时,变换被重置

    因为这就是缩放。它是对图像进行比例变换的应用。该比例变换正在取代您的旋转变换。

    您可以尝试实现zoom 委托方法,以便在用户缩放时一次又一次地重新应用旋转变换。但请记住相对于缩放变换应用它,否则您将失去缩放。

    【讨论】:

    • 是的,这完全正确。一个更简单的解决方法是包装内容视图(或滚动视图)的另一个 UIView,以便您可以应用自己的转换而不会干扰滚动视图的实现。如果您想在 scrollView 及其子类的顶部添加手势识别器,您通常需要相同的解决方法...
    • @Jef,包装器是个好主意!