1

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

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

有谁知道可能导致此问题的原因是什么?

4

1 回答 1

7

通过将转换应用于 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 将用于缩放。图像视图的旋转仍然通过setTransform:使用CGAffineTransformScale和的动画来完成CGAffineTransformMakeRotation

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

于 2013-03-07T13:46:29.057 回答