我正在使用带有多个UIScrollViews的UIScrollView作为子视图,每个都包含一个UIImageView来显示图片 .
应用程序本身仅支持纵向方向,但我确实希望在旋转设备时旋转图像视图(观察UIDeviceOrientationDidChangeNotification) .
使用 CGAffineTransformScale
和 CGAffineTransformMakeRotation
动画 setTransform:
完成图像视图的旋转 .
通过从包含图像视图的滚动视图返回 viewForZoomingInScrollView:
的图像视图来完成图像视图的缩放 .
这一切都很有效,除了一件事:当图像视图旋转时,我无法再缩放 . 调试显示正在调用 viewForZoomingInScrollView:
,但 scrollViewDidZoom:
不是 .
有没有人知道可能导致这个问题的原因是什么?
1 回答
通过将转换应用于UIScrollView(包含UIImageView)而不是UIImageView本身来修复它 .
仅将转换应用于UIScrollView并不能很好地工作 . 它会将旋转的图像放在较小的视图中,并且缩放不会使用可用的屏幕空间 .
我终于设法解决了这个问题,所以这就是方法 .
Requirements
水平滚动全屏图片列表
旋转设备不得旋转应用程序,但必须旋转显示的图片
必须能够在纵向和横向握住设备时缩放图片
How I implemented it
一个主要的UIScrollView,高度等于屏幕高度,宽度等于屏幕宽度*图片数 . 分页已启用 .
这个主UIScrollView包含每张图片的子视图 . 每个子视图如下所示:
UIScrollView> UIView> UIImageView
UIScrollView具有屏幕大小,其origin.x属性对于第一个子视图为0,并随着每个后续UIScrollView的屏幕宽度而增加 . 结果是一个主UIScrollView,所有子UIScrollViews就像这样(没有间距):
为了解决旋转问题,UIImageView不再是UIScrollView的直接子视图,而是嵌入在容器UIView中 .
主UIScrollView委托的
viewForZoomingInScrollView:
方法现在返回可见图片的容器UIView,因此该容器UIView将用于缩放 . 使用CGAffineTransformScale
和CGAffineTransformMakeRotation
动画setTransform:
仍然可以旋转图像视图 .我猜测没有容器UIView的实现不起作用,是因为UIImageView不能再被主UIScrollView转换,当时已经应用了转换 .