我有一个UIScrollView,它包含一个图像和一个分段控件,允许用户在ScrollView中切换图像。如果我只是将图像交换到UIImageView内部,它将以放大状态显示新图像。如何将UIScrollView重置为未放大状态?
答案 0 :(得分:2)
我详细讨论了UIScrollView缩放在github.com/andreyvit/ScrollingMadness/的工作原理(以及原因)。
(将链接还包含了如何编程方式放大UIScrollView的描述,如何效仿图片库式传呼+变焦+滚动,实例项目和ZoomScrollView类,封装了一些神奇的放大。)
引用:
UIScrollView没有“当前缩放级别”的概念,因为它包含的每个子视图可能都有自己的当前缩放级别。请注意,UIScrollView中没有字段来保持当前缩放级别。但是我们知道有人存储缩放级别,因为如果你捏缩放子视图,然后将其变换重置为CGAffineTransformIdentity,然后再次捏,你会注意到子视图的先前缩放级别已经恢复。
实际上,如果你看一下反汇编,UIView就会存储它自己的缩放级别(在_gestureInfo字段指向的UIGestureInfo对象中)。它还有一组很好的未记录方法,如zoomScale
和setZoomScale:animated:
。 (请注意,它也有一堆与旋转相关的方法,也许我们很快就会获得旋转手势支持。)
但是,如果我们仅为缩放创建一个新的UIView并将我们的真实可缩放视图添加为其子视图,我们将始终以缩放级别1.0开始。我对程序化缩放的实现基于这个技巧。
答案 1 :(得分:0)
如果您没有在完成缩放缩放事件时重新绘制视图,则缩放因子将由您从viewForZoomingInScrollView:delegate方法返回的视图的transform属性设置。要重置此缩放,请将视图的transform属性的值设置为CGAffineTransformIdentity。
请注意,您的下一个缩放变焦操作将从前一个缩放变焦停止的位置开始(即,您的新缩放将被忽略)。要解决此问题,您可能需要实现我所描述的here。