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

时间:2013-03-06 22:02:02

标签: ios cocoa-touch uiscrollview uiimageview

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

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

有没有人知道可能导致此问题的原因?

1 个答案:

答案 0 :(得分:7)

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

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

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

<强>要求

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

我是如何实施的

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

UIScrollView具有屏幕大小,其origin.x属性对于第一个子视图为0,并随着每个后续UIScrollView的屏幕宽度而增加。结果是一个主UIScrollView,所有子UIScrollViews都是这样的(没有间距):

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

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

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