设备方向改变时调整 PDF 视图大小
Resize PDF View when device orientation changes
我的应用程序中有一个 ViewController 允许用户打开 PDF。该应用程序支持设备的横向和纵向方向。当用户在打开 PDF 后更改设备方向时,我遇到了问题。 PDF 有两页:
第 1 页 - 全粉红和
第 2 页 - 全紫色
打开 PDF 并且用户更改设备方向后,我遇到了框架问题。如果以纵向打开 PDF,一旦设备的排列方式更改为横向,pdf 只会填满屏幕的一半:
同样,如果 PDF 以横向打开,则当设备方向为纵向时,pdf 将仅显示在屏幕的一半上:
这是我的代码:
import UIKit
import PDFKit
class PDFfun: UIViewController {
var pdfView = PDFView()
override func viewDidLoad() {
super.viewDidLoad()
pdfView = PDFView(frame: self.view.frame)
if let documentURL = Bundle.main.url(forResource: "Blank", withExtension: "pdf"),
let document = PDFDocument(url: documentURL),
let _ = document.page(at: 0) {
pdfView.document = document
pdfView.autoScales = true
pdfView.backgroundColor = UIColor.lightGray
pdfView.autoScales = true
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
if UIDevice.current.orientation.isLandscape {
print("landscape")
pdfView = PDFView(frame: view.frame)
pdfView.autoScales = true
} else {
print("portait")
pdfView = PDFView(frame: view.frame)
pdfView.autoScales = true
}
}
}
我厌倦了添加 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
来解决我的问题,但我发现没有任何变化。
最好的方法是向 pdfView 添加布局约束。例如在您的 viewDidLoad 中:
pdfView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(pdfView)
view.addConstraints([
NSLayoutConstraint(item: pdfView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pdfView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pdfView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pdfView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
])
如果您不想使用 layoutConstraint,您也可以在 viewDidLayoutSubviews 方法中为您的 pdfView 设置框架:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
pdfView.frame = view.frame
}
并且不要忘记删除 viewWillTransition 方法中的代码。
我的应用程序中有一个 ViewController 允许用户打开 PDF。该应用程序支持设备的横向和纵向方向。当用户在打开 PDF 后更改设备方向时,我遇到了问题。 PDF 有两页: 第 1 页 - 全粉红和 第 2 页 - 全紫色
打开 PDF 并且用户更改设备方向后,我遇到了框架问题。如果以纵向打开 PDF,一旦设备的排列方式更改为横向,pdf 只会填满屏幕的一半:
同样,如果 PDF 以横向打开,则当设备方向为纵向时,pdf 将仅显示在屏幕的一半上:
这是我的代码:
import UIKit
import PDFKit
class PDFfun: UIViewController {
var pdfView = PDFView()
override func viewDidLoad() {
super.viewDidLoad()
pdfView = PDFView(frame: self.view.frame)
if let documentURL = Bundle.main.url(forResource: "Blank", withExtension: "pdf"),
let document = PDFDocument(url: documentURL),
let _ = document.page(at: 0) {
pdfView.document = document
pdfView.autoScales = true
pdfView.backgroundColor = UIColor.lightGray
pdfView.autoScales = true
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
if UIDevice.current.orientation.isLandscape {
print("landscape")
pdfView = PDFView(frame: view.frame)
pdfView.autoScales = true
} else {
print("portait")
pdfView = PDFView(frame: view.frame)
pdfView.autoScales = true
}
}
}
我厌倦了添加 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
来解决我的问题,但我发现没有任何变化。
最好的方法是向 pdfView 添加布局约束。例如在您的 viewDidLoad 中:
pdfView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(pdfView)
view.addConstraints([
NSLayoutConstraint(item: pdfView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pdfView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pdfView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0),
NSLayoutConstraint(item: pdfView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
])
如果您不想使用 layoutConstraint,您也可以在 viewDidLayoutSubviews 方法中为您的 pdfView 设置框架:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
pdfView.frame = view.frame
}
并且不要忘记删除 viewWillTransition 方法中的代码。