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

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

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

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

我发现“调整” View 大小的唯一方法是捕获viewWillTransitionToSize中的旋转,从 super View 中删除PDFView,并完全重新配置 View (包括重新加载文档),然后再将其重新显示在屏幕上。那是可怕的用户体验。

我将代码提取到一个简单的单 View 产品中。整个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

ios - PDFKit : PDFView doesn't resize when device rotated-LMLPHP
ios - PDFKit : PDFView doesn't resize when device rotated-LMLPHP

最佳答案

我发现,至少在某些情况下,autoScales值在旋转时会重置为NO。在WWDC实验室讨论中证实,这似乎是PDFKit中的错误。我使用以下代码解决了该错误:

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

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

关于ios - PDFKit : PDFView doesn't resize when device rotated,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50647315/

10-12 19:46