我正在创建一个PDFViewer应用程序。 我已将PDFViewer的autoScale属性设置为true,以便视图扩展到屏幕的宽度。 适用于大型PDF文档。 但是当文档是单页文档时,页面会自动向下滚动到页面的末尾,而不是从头开始。 我只是无法理解它的根本原因。 我在这里缺少什么?
答案 0 :(得分:8)
我认为这是PDFView中的一个错误。
作为解决方法,我建议手动滚动顶部:
self.pdfView.document = pdfDocument;
NSPoint pt = NSMakePoint(0.0, [self.pdfView.documentView bounds].size.height);
[self.pdfView.documentView scrollPoint:pt];
rdar://37942090:PDFview在单页文档中滚动到页面底部。
答案 1 :(得分:4)
我建议使用此解决方案滚动到第一页的顶部(它适用于iOS 11.3):
if let document = pdfView.document,
let firstPage = document.page(at: 0)
{
let firstPageBounds = firstPage.bounds(for: pdfView.displayBox)
pdfView.go(to: CGRect(x: 0, y: firstPageBounds.height, width: 1.0, height: 1.0), on: firstPage)
}
答案 2 :(得分:4)
在扩展Petro的答案时,我遇到了一些旋转页面和裁剪页面的问题,但这似乎普遍适用。我实际上在旋转的页面上对其进行了测试,并在角落添加了注释,以验证是否选择了右边的角落:
guard let firstPage = pdfView!.document?.page(at: 0) else {
return;
}
let firstPageBounds = firstPage.bounds(for: pdfView!.displayBox)
switch (firstPage.rotation % 360) {
case 0:
topLeftX = firstPageBounds.minX
topLeftY = firstPageBounds.maxY
case 90:
topLeftX = firstPageBounds.minX
topLeftY = firstPageBounds.minY
case 180:
topLeftX = firstPageBounds.maxX
topLeftY = firstPageBounds.minY
case 270:
topLeftX = firstPageBounds.maxX
topLeftY = firstPageBounds.maxY
default:
print ("Invalid rotation value, not divisible by 90")
}
pdfView!.go(to: CGRect(x: topLeftX, y: topLeftY, width: 1.0, height: 1.0), on: firstPage)
答案 3 :(得分:2)
看起来go
命令需要在下一次运行循环中完成才能可靠地工作:
DispatchQueue.main.async
{
guard let firstPage = pdfView.document?.page(at: 0) else { return }
pdfView.go(to: CGRect(x: 0, y: Int.max, width: 0, height: 0), on: firstPage)
}
在iOS 12上测试
答案 4 :(得分:2)
这就是我所做的,有点hacky
if let scrollView = pdfView.subviews.first as? UIScrollView {
scrollView.contentOffset.y = 0.0
}
答案 5 :(得分:1)
我正在将文档加载到viewDidLoad中,然后将其移至viewDidAppear,它对我有用。
答案 6 :(得分:1)
PDFPage的旋转很重要!这是Oded的Objective-C版本:
- (void)scrollToTopOfPage:(PDFPage *)page {
CGRect pageBounds = [page boundsForBox:self.displayBox];
CGFloat topLeftX = 0;
CGFloat topLeftY = 0;
switch (page.rotation % 360) {
case 0:
topLeftX = CGRectGetMinX(pageBounds);
topLeftY = CGRectGetMaxY(pageBounds);
break;
case 90:
topLeftX = CGRectGetMinX(pageBounds);
topLeftY = CGRectGetMinY(pageBounds);
break;
case 180:
topLeftX = CGRectGetMaxX(pageBounds);
topLeftY = CGRectGetMinY(pageBounds);
break;
case 270:
topLeftX = CGRectGetMaxX(pageBounds);
topLeftY = CGRectGetMaxY(pageBounds);
break;
default:
break;
}
[self goToRect:CGRectMake(topLeftX, topLeftY, 1, 1) onPage:page];
}
答案 7 :(得分:0)
用于Objective-C:
PDFPage *firstPage = [pdfView.document pageAtIndex:0];
CGRect firstPageBounds = [firstPage boundsForBox:pdfView.displayBox];
[pdfView goToRect:CGRectMake(0, firstPageBounds.size.height, 1, 1) onPage:firstPage];
答案 8 :(得分:0)
if let document = PDFDocument(url: viewModel.url) {
pdfView.document = document
// avoid iOS autoscale issue
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
self?.pdfView.autoScales = true
}
}
我使用变通方法在文档加载后定义了 autoScales
属性。那么第一页就很适合放在上面。