执行摘要:
有时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而不是ZoomingPDFViewerViewControllerscrollViewsv - 添加到PDFScrollview.m中
viewDidLoad_handleTapFrom:recognizerzoomOutZoomingPDFViewerViewController - 注释掉了
scrollViewDidEndZooming:withView:atScale,scrollViewWillBeginZooming:withView:因为他们在图像背景中做的事情分散了手头的问题
非常感谢您对我的包容,以及任何和所有的帮助!