包含旋转的 UIImageView 的 UIScrollView 不会缩放
Posted
技术标签:
【中文标题】包含旋转的 UIImageView 的 UIScrollView 不会缩放【英文标题】:UIScrollView containing rotated UIImageView won't zoom 【发布时间】:2013-03-06 22:02:02 【问题描述】:我正在使用带有多个 UIScrollView 作为子视图的 UIScrollView,每个都包含一个 UIImageView 来显示图片。
该应用程序本身仅支持纵向,但我确实希望图像视图在设备旋转时旋转(观察 UIDeviceOrientationDidChangeNotification)。
使用 CGAffineTransformScale
和 CGAffineTransformMakeRotation
的动画 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 将用于缩放。
图像视图的旋转仍然通过使用CGAffineTransformScale
和CGAffineTransformMakeRotation
的动画setTransform:
完成。
我猜测没有容器 UIView 的实现不起作用,是因为 UIImageView 不能再被主 UIScrollView 转换,而已经应用了转换。
【讨论】:
可爱的解决方案,我在摆弄同样的问题,得出了相同的结论,即已经应用于 UIImageView 进行旋转的转换与比例不匹配。您的解决方案运行良好,尽管存在一个小的裁剪问题,因为 UIView 不知道将在其中旋转的 UIImageView 的有效边界,因此这不会增加滚动视图的 contentSize。我相信将不得不计算并手动增加 scrollView 的 contentSize。 谢谢你 - 我有一个类似的问题,但它是一个棘手的谷歌:)以上是关于包含旋转的 UIImageView 的 UIScrollView 不会缩放的主要内容,如果未能解决你的问题,请参考以下文章