iOS PDFKit 在 PDFView 中调整 pdf 框架

Cla*_*lis 6 ios swift ios-pdfkit apple-pdfkit

我有一个 PDF,其中包含不同高度的页面,我希望以水平分页方式显示,一次一页,页面之间没有间隙,并且每个页面的顶部与视图的顶部对齐。例如:

所需的渲染

我想使用PDFKit's PDFView,特别是因为这些设置可以通过以下方式实现:

let pdfView = PDFView()
pdfView.displayDirection = .horizontal
pdfView.displaysPageBreaks = false
pdfView.usePageViewController(true, withViewOptions: nil)
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下结果:

实际渲染

这是由于页面的高度不同。每个页面在 中垂直居中PDFView,如果页面的高度大于视图的高度(例如第 2 页),则按比例缩放以适应。

为了尝试解决第一个问题,垂直偏移,我尝试了几件事。首先,这是毛,我知道这是错的,检查视图层次结构,并找到个人视图(已命名的类的观点后PDFTextInputView,页面呈现内我已经试过调整其框架的)origin.y0时最外面的滚动视图(另一个私人视图)滚动。这是因为每当下一页或上一页滚动到视图中时,页面都会呈现在视图的顶部。但是,一旦用户捏住以放大该页面,其框架会自动跳回居中。除了依赖私有视图层次结构之外,这种方法是行不通的。

为了尝试解决“高页面问题”(第 2 页),我尝试在出现新页面时调整 PDFView 的比例因子。遗憾的是,.PDFViewPageChanged通知仅滚动视图结束减速才会触发,因此页面在滚动时会缩小,然后当我调整比例因子时,它会跳转以适应屏幕的宽度。然后我转向.PDFViewVisiblePagesChanged在下一页/上一页出现时确实会触发的.PDFViewPageChanged.

我尝试过的其他事情:

  • 调整transform文档视图
  • 截取捏合手势并调整文档视图的中心
  • 创建我自己的页面控制器并每页渲染一个 PDF 页面(不使用pdfView.usePageViewController

有没有人对我如何实现我所追求的有任何想法?

Cla*_*lis 5

新黑客:

事实证明,在挖掘了一些更多的私有 API(是的,这个解决方案仍然很粗糙)之后,我完全忽略了这个神奇的属性PDFScrollView(私有的内部视图),称为......

forcesTopAlignment

要启用此功能,请PDFScrollView在您的PDFView和中找到:

pdfScrollView.setValue(true, forKey: "forcesTopAlignment")
Run Code Online (Sandbox Code Playgroud)

这就是窍门!


旧黑客:

经过几天的苦苦挣扎,我终于找到了一种方法,可以按照PDFView自己的意愿行事。

披露:该解决方案使用方法调配并依赖于私有视图层次结构,并且可能随时中断。也就是说,它目前有效,我对这个解决方案感到满意。

完整的解决方案可在本要点中找到。(肉在里面overrideCenterAlign。)

有一个恰当命名的私有方法_centerAlign,当 pdf 页面出现在屏幕上以及通过捏合手势缩放时,它会垂直居中并缩放 pdf 页面。调整该方法允许我注入自己的逻辑并应用自己的转换来按照我想要的方式定位 pdf 视图(页面顶部与视图顶部对齐。)

有两种情况需要考虑。“短页”情况(示例中的第 1、3、4 页)和“高页”情况(示例中的第 2 页)。在这两种情况下,我首先调用 的原始实现,_centerAlign以便它可以应用其转换并管理更新内部滚动视图。

  • 对于“短页”情况,我应用相同的变换和垂直平移,将 pdf 的顶部与视图的顶部对齐。
  • 对于“长页面”情况,我在内部滚动视图出现在屏幕上时调整其缩放比例,以便缩放以适合视图的宽度。

综上所述,我对不依赖私有方法和视图层次结构的更干净的解决方案持开放态度。如果您知道更好的方法来完成此任务,请发布答案!