执行摘要:
有时UIScrollView
会对 的值进行不必要的更改contentOffset
,从而导致应用程序在正在查看的文档中显示错误的位置。不需要的更改与滚动视图的zoomScale
.
详细信息:
我CATiledLayer
在使用UIScrollView
. CATiledLayer
保存一个pdf,当在contentOffset
一定范围内时,当我缩小时,contentOffset
在缩放发生之前改变了(这就是错误)。contentOffset
似乎在 Apple 的代码中有所更改。
为了说明这个问题,我修改了 Apple 的示例应用程序 ZoomingPDFViewer。代码在github上:https ://github.com/DirkMaas/ZoomingPDFViewer-bug
点击将导致zoomScale
更改为 0.5,使用animateWithDuration
,从而缩小。如果UIScrollView
'scontentOffset.y
小于 2700 或大于 5900,则zoomScale
动画效果很好。如果点击发生contentOffset.y
在这两个值之间,contentOffset.y
则将跳转(未动画)到大约 2700,然后zoomScale
会发生动画,但会同时发生滚动,因此当动画完成时,contentOffset.y
就是它所在的位置应该。但跳跃从何而来?
例如,contentOffset.y
点击屏幕时假设是 2000:zoomScale
动画效果很好;contentOffset.y
没有改变。
但是如果在contentOffset.y
点击屏幕时是 4000:contentOffset.y
将在没有动画的情况下跳转到大约 2700,然后缩放和滚动将从该点开始并同时发生。动画完成后,看起来好像我们从 4000 直接放大,所以我们最终在正确的位置,但行为是错误的。
关于 UI 的说明:
- 文本可以以正常方式垂直滚动
- 可以通过正常方式捏合来放大和缩小文本
- 单击一下将导致
zoomScale
设置为 0.5;变化是动画的
我注意到如果zoomScale
大于 0.5,则跳跃不是那么大。另外,如果我使用setZoomScale:animated:
而不是animateWithDuration
,错误就会消失,但我不能使用它,因为我需要链接动画。
这是我所做的总结(github中的代码包括这些更改):
- 从http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html下载 ZoomingPDFViewer 并在 XCode 中打开
- 更改构建设置 | 架构 | Base SDK 到最新的 iOS (iOS 4.3) 更改了构建设置 | GCC 4.2 - 语言 | 根据 Objective-C++ 编译源代码
- 从项目中删除了 TestPage.pdf
- 将“whoiam 5 24 cropped 3-2.pdf”添加到项目中
- 添加
PDFScrollView *scrollView;
到ZoomingPDFViewerViewController
课堂 - 改为初始化
loadView
而不是ZoomingPDFViewerViewController
scrollView
sv
- 添加到PDFScrollview.m中
viewDidLoad
_handleTapFrom:recognizer
zoomOut
ZoomingPDFViewerViewController
- 注释掉了
scrollViewDidEndZooming:withView:atScale
,scrollViewWillBeginZooming:withView:
因为他们在图像背景中做的事情分散了手头的问题
非常感谢您对我的包容,以及任何和所有的帮助!