PDFKit:PDFView 在设备旋转时不会调整大小

Mit*_*hen 6 rotation pdfview ios

我有一个显示 PDFView 的 iPad 应用程序。该应用程序可旋转到任何方向。PDFView 是全屏和单页的。PDF 在任一方向启动时都按预期显示;整个第一页都是可见的,缩放到适合屏幕,没有任何 PDF 出现在屏幕外。PDF 将始终是美国信纸大小的文档。

旋转时,PDF 会旋转,但不会调整大小。当旋转横向到纵向时,PDF 显示为“太小” - 外面有一个巨大的空边框。当从纵向旋转到横向时,将显示 PDF 的顶部三分之二,底部三分之一丢失在屏幕底部下方。

自动布局是在代码中配置的,而且相当简单(顶部、前导、高度和宽度)。

我在 Reveal 中查看了布局。它表明 PDFView 实际上按照 AutoLayout 配置正确调整大小。PDFView 内部是一个(私有)PDFDocumentView,它不会调整大小。

我发现“调整”视图大小的唯一方法是在 viewWillTransitionToSize 中捕捉旋转,从超级视图中删除 PDFView,并在将视图放回屏幕之前完全重新配置视图(包括重新加载文档)。这是一个糟糕的用户体验。

我将代码提取到一个简单的单视图产品中。整个 UIViewController 的代码如下。下面还有来自 Reveal 的屏幕截图,显示了这个问题。在这种情况下,我以纵向启动应用程序,旋转设备,然后截取这些屏幕截图。(显示的 PDF 是 IRS 税表;我和应用程序都与 IRS 无关 - 它恰好是我使用的默认示例 PDF。)

#import "ViewController.h"
@import PDFKit;

@interface ViewController ()
@property (nonatomic, strong) PDFView *pdfView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupPDF];
}

-(void)setupPDF {
    NSString *filename = @"myfile.pdf";
    NSString *filenameWithoutPDF = [filename stringByReplacingOccurrencesOfString:@".pdf" withString:@""];
    NSURL *url = [[NSBundle mainBundle] URLForResource:filenameWithoutPDF withExtension:@"pdf"];
    NSData *data = [NSData dataWithContentsOfURL:url];

    self.pdfView = [[PDFView alloc] init];
    PDFDocument *document = [[PDFDocument alloc] initWithData:data];
    self.pdfView.document = document;
    self.pdfView.displayMode = kPDFDisplaySinglePage;
    self.pdfView.autoScales = YES;

    [self.view addSubview:self.pdfView];

    [self setupConstraints];
}

-(void)setupConstraints {
    [self.pdfView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.pdfView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.pdfView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.pdfView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.pdfView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0]];    
}
@end
Run Code Online (Sandbox Code Playgroud)

私有 PDFDocumentView 的大小错误 PDFView 有正确的布局

Mit*_*hen 5

我发现 autoScales 值在旋转时重置为 NO,至少在某些情况下是这样。这似乎是 PDFKit 中的一个错误,在 WWDC 实验室讨论中得到证实。我已经用这段代码解决了这个错误:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    self.pdfView.autoScales = YES;
}
Run Code Online (Sandbox Code Playgroud)

我已经向 Apple 提交了这个错误;雷达 40848802 如果有人想欺骗它。