【发布时间】:2011-11-10 05:35:02
【问题描述】:
执行摘要:
有时UIScrollView 会对contentOffset 的值进行不必要的更改,从而导致应用程序在正在查看的文档中显示错误的位置。不需要的更改与滚动视图的 zoomScale 的动画更改一起发生。
详情:
在UIScrollView 中使用CATiledLayer 缩小时遇到问题。 CATiledLayer 保存一个pdf,当contentOffset 在一定范围内时,当我缩小时,contentOffset 在缩放发生之前被更改(这是错误)。 contentOffset 似乎在 Apple 的代码中有所更改。
为了说明问题,我修改了 Apple 的示例应用程序 ZoomingPDFViewer。代码在github上:https://github.com/DirkMaas/ZoomingPDFViewer-bug
点击将导致zoomScale 更改为0.5,使用animateWithDuration,从而缩小。如果UIScrollView 的contentOffset.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 处直接放大,所以我们最终在正确的位置,但行为是错误的。
关于用户界面的说明:
- 文字可以正常垂直滚动
- 文本可以通过正常的捏合方式放大和缩小
- 单击将导致
zoomScale设置为0.5;变化是动画的
我注意到如果zoomScale 大于 0.5,则跳跃不是那么大。另外,如果我使用setZoomScale:animated: 而不是animateWithDuration,错误就会消失,但我不能使用它,因为我需要链接动画。
以下是我所做的总结(github 中的代码包括这些更改):
- 从下载 ZoomingPDFViewer http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html 并在 XCode 中打开
- 更改了构建设置 |架构 | Base SDK 到最新的 iOS (iOS 4.3) 更改了构建设置 | GCC 4.2 - 语言 |根据 Objective-C++ 编译源代码
- 从项目中删除了 TestPage.pdf
- 在项目中添加了“whoiam 5 24 cropped 3-2.pdf”
- 将
PDFScrollView *scrollView;添加到ZoomingPDFViewerViewController类 - 将
ZoomingPDFViewerViewController中的loadView更改为初始化scrollView而不是sv - 在 PDFScrollview.m 中将
viewDidLoad、handleTapFrom:recognizer和zoomOut添加到ZoomingPDFViewerViewController - 注释掉了
scrollViewDidEndZooming:withView:atScale和scrollViewWillBeginZooming:withView:,因为它们在图片背景中做的事情会分散手头的问题
非常感谢您对我的包容,以及任何和所有的帮助!
【问题讨论】:
-
需要链接动画是什么意思?为什么你不能使用
scrollViewDidEndZooming:withView:atScale来通知你缩放何时完成? -
@Michael Frederick -- 好点。这是一种解决方法,但我喜欢使用
animateWithDuration:而不是setZoomScale:Animated:,因为除非我遗漏了什么,否则后者不允许控制持续时间,而且在我看来,块动画做得更好,将相关代码放在一起。另外,Apple 似乎鼓励我们使用块动画。所以也许我应该说“我不想使用setZoomScale:Animated:”。感谢您的评论!
标签: iphone ios uiscrollview core-animation catiledlayer