iPhone OS 3.2; PDF渲染;用户交互

时间:2010-05-26 15:01:14

标签: ipad pdf uiwebview quartz-graphics

我需要创建一个可以渲染多个PDF文件的iPad应用程序(一个文件包含一个页面)。 每个页面都应该是可滚动的,可缩放的,如果用户点击PDF的一部分,应该弹出一个网站或照片库。

目前我认为我可以这样做:

一个。的UIWebView

显示pdf的精彩,滚动和缩放效果。但实现PDF的可点击部分看起来很麻烦。

  1. 我不知道我是否可以使用CGPDFContextSetURLForRect
  2. 从UIWebView获取触摸事件来执行像CGPDFContextSetURLForRect这样的事情,我自己看起来像是一些“非常糟糕”的黑客攻击。请参阅:http://github.com/psychs/iphone-samples/blob/master/WebViewTappingHack/Classes/PSWebView.m
  3. B中。石英

    我找到了一些描述如何通过Quartz直接显示PDF的资源。 见:http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html

    1. 这将允许使用CGPDFContextSetURLForRect
    2. 但我不知道这是否会像UIWebView一样支持滚动和缩放开箱即用?
    3. 有人可以赐教我吗?

      谢谢你的时间!

      [编辑:更改3.0到3.2] [编辑:我的“解决方案”]

      嗨!

      我可以为PNG提供一个有效的实现,但不能用于PDF。

      [摘要] 我的解决方法是渲染内容,拦截其中的触摸,如果是一次触摸,则相对于显示的内容检索坐标,最后查找包含交互区域的坐标作为坐标以及如果点击它们该怎么做的操作

      [适用于PNG] 实现这样的想法比我想象的更麻烦...... 我实现的实现在很大程度上取决于你想要显示的内容,因为这对UIImageView有用,但我无法使用UIWebView。

      首先,您需要UIScrollView和UIImageView来呈现内容并支持滚动/缩放。 然后你需要实现一些处理来获得你感兴趣的触摸/手势。 请参阅:developer.apple.com/iphone/library/samplecode/ScrollViewSuite/Listings/1_TapToZoom_Classes_TapDetectingImageView_h.html

      Apple提供的这个示例提供了使这部分工作所需的一切。 作为奖励,它还需要关注相对于内容视口的坐标转换,这非常方便! (否则你只会知道屏幕上的点击发生在哪里,如果你的内容是缩放/可滚动的,你只需要信息的一半)

      [PDF] 如果你想用PDF做这件事,首先你需要使用UIWebView(可能你也可以通过Quartz或其他东西来做)

      使用UIWebView进行操作真是太痛苦了! 网上提出了很多方法,除了一个没人做了它应该做的事情。 经过几天的谷歌搜索,我发现了这个宝石:cocoawithlove.com/2009/05/intercepting-status-bar-touches-on.html

      所以......子类化UIWebView并不像UIImageView那样让你到达任何地方,你必须继承UIApplicationMain并实现其处理触摸事件的方法。 在这里,您可以重复使用上面的apple-examlpe中的一些“Touch-Handling-Stuff”。

      现在,如果缩放/滚动,您需要将触摸的坐标转换为内容。与UIImageView不同,UIWebView不会为你做这个!

      我永远无法弄清楚如何从UIWebView获取所需的信息(zoomlevel的内容的哪一部分)来转换坐标,但由于从PDF到PNG的要求已经改变,我并不关心它是否正常工作太多了。

      希望这会有所帮助。

1 个答案:

答案 0 :(得分:0)

使用CGPDF *运算符将允许您编写UIPDFView,其操作与UIImageView完全相同,但使用PDF作为源图像。创建自己的UIView自定义子类并实现drawRect:to,最终调用CGContextDrawPDFPage。基于快速谷歌搜索(因为我知道关键字),this page似乎很好地解释了这方面的事情。

然后,您可以直接将自定义UIView子类替换为UIImageView,并完全按照PNG解决方案进行操作。