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