包含旋转的 UIImageView 的 UIScrollView 不会缩放

Posted

技术标签:

【中文标题】包含旋转的 UIImageView 的 UIScrollView 不会缩放【英文标题】:UIScrollView containing rotated UIImageView won't zoom 【发布时间】:2013-03-06 22:02:02 【问题描述】:

我正在使用带有多个 UIScrollView 作为子视图的 UIScrollView,每个都包含一个 UIImageView 来显示图片。 该应用程序本身仅支持纵向,但我确实希望图像视图在设备旋转时旋转(观察 UIDeviceOrientationDidChangeNotification)。 使用 CGAffineTransformScaleCGAffineTransformMakeRotation 的动画 setTransform: 完成图像视图的旋转。 缩放图像视图是通过从 viewForZoomingInScrollView: 返回包含图像视图的滚动视图的图像视图来完成的。

这一切都很好,除了一件事:当图像视图旋转时,我不再能够缩放。调试显示正在调用viewForZoomingInScrollView:,但没有调用scrollViewDidZoom:

有没有人知道是什么导致了这个问题?

【问题讨论】:

但是纵向可以放大吗?如果您旋转到横向,然后再转回纵向,您可以再次缩放吗? 是的,我可以在纵向时放大,是的,我可以在返回纵向时再次放大。 【参考方案1】:

通过将转换应用于 UIScrollView(包含 UIImageView)而不是 UIImageView 本身来修复它。

仅将转换应用到 UIScrollView 并不能很好地工作。它会将旋转后的图像放在一个较小的视图中,并且缩放不会使用可用的屏幕空间。

不过,我终于设法解决了这个问题,这就是方法。

要求

水平滚动的全屏图片列表 旋转设备必须旋转应用程序,但必须旋转显示的图片 必须能够在纵向和横向握持设备时缩放图片

我是如何实现的

一个主 UIScrollView,高度等于屏幕高度,宽度等于屏幕宽度 * 图片数。已启用分页。 这个主 UIScrollView 包含每个图片的子视图。每个子视图如下所示: UIScrollView > UIView > UIImageView

UIScrollView 有屏幕的大小,它的origin.x 属性对于第一个子视图为0,并且随着每个后续UIScrollView 的屏幕宽度增加。结果是一个主 UIScrollView,所有子 UIScrollView 像这样彼此相邻(没有间距):

┌────────────────────┐
│┌───┐┌───┐┌───┐┌───┐│
││ 1 ││ 2 ││ 3 ││ 4 ││
││   ││   ││   ││   ││
│└───┘└───┘└───┘└───┘│
└────────────────────┘

为了解决旋转问题,UIImageView 不再是 UIScrollView 的直接子视图,而是现在嵌入到容器 UIView 中。 主 UIScrollView 委托的 viewForZoomingInScrollView: 方法现在返回可见图片的容器 UIView,因此该容器 UIView 将用于缩放。 图像视图的旋转仍然通过使用CGAffineTransformScaleCGAffineTransformMakeRotation 的动画setTransform: 完成。

我猜测没有容器 UIView 的实现不起作用,是因为 UIImageView 不能再被主 UIScrollView 转换,而已经应用了转换。

【讨论】:

可爱的解决方案,我在摆弄同样的问题,得出了相同的结论,即已经应用于 UIImageView 进行旋转的转换与比例不匹配。您的解决方案运行良好,尽管存在一个小的裁剪问题,因为 UIView 不知道将在其中旋转的 UIImageView 的有效边界,因此这不会增加滚动视图的 contentSize。我相信将不得不计算并手动增加 scrollView 的 contentSize。 谢谢你 - 我有一个类似的问题,但它是一个棘手的谷歌:)

以上是关于包含旋转的 UIImageView 的 UIScrollView 不会缩放的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView 没有正确旋转?

UIImageView 手势(缩放、旋转)问题

如何使用 TouchesMoved 旋转 UIImageView

AutoLayout - 不旋转的 UIImageView

旋转 uiimageview 时出现问题

UIImageView:旋转和缩放。如何保存结果?