iOS PDFKit не заполняет UIView
Я использую PDFKit для отображения простых PDF-файлов. Когда я отображаю их на экране внутри UIView, я использовал приведенный ниже код.
Цели: - начать с содержимого, чтобы заполнить вид - хотите заполнить всю ширину экрана
override func viewDidLoad() {
super.viewDidLoad()
if let path = Bundle.main.path(forResource: "Disclaimer", ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView.document = pdfDocument
pdfView.autoScales = true
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
pdfView.displayMode = .singlePageContinuous
pdfView.displaysPageBreaks = false
}
}
self.view.backgroundColor = UIColor.black
}
В раскадровке я установил ограничение для UIview, чтобы заполнить всю ширину экрана - что он делает.
С помощью autoscale
Продажи PDF-документа меньше ширины экрана, это в основном добавляет поле вокруг PDF. Я могу увеличить масштаб изображения и заставить его заполнить весь экран, прежде чем он переполнится и полосы прокрутки вступят в игру.
Если я установлю масштабный коэффициент вручную, я смогу заставить одну страницу PDF заполнить по ширине экрана, но если PDF имеет более одной страницы, то ширина станет меньше ширины экрана с margin
подарок.
В конечном счете, я просто хочу заполнить всю ширину экрана PDF без каких-либо полей / пробелов.
Был бы признателен за помощь.
ОБНОВЛЕНИЕ: код, используемый согласно совету ниже, но в настоящее время не работает:
if let path = Bundle.main.path(forResource: pdfObject, ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView = PDFView(frame: CGRect(x: 0, y: 0, width: pdfView.frame.width, height: pdfView.frame.height))
pdfView.document = pdfDocument
}
}
Примечание: pdfView - это мой UIView, то есть PDFView.
2 ответа
Да, во-первых, большое спасибо Махешу. Хотя его ответ не дал прямого ответа на мой вопрос, две вещи, которые они сказали, действительно помогли решить эту проблему.
В целом, чтобы настроить PDF для заполнения представления, мне нужно было установить автоматическое изменение размера и автомасштабирование ДО
pdfView.document = pdfDocument
И чтобы затем контролировать масштаб, установите эти ПОСЛЕ
pdfView.document = pdfDocument
Таким образом, мой окончательный код:
func pdfDisplay() {
if let path = Bundle.main.path(forResource: pdfObject, ofType: "pdf") {
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView.autoresizesSubviews = true
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleTopMargin, .flexibleLeftMargin]
pdfView.displayDirection = .vertical
pdfView.autoScales = true
pdfView.displayMode = .singlePageContinuous
pdfView.displaysPageBreaks = true
pdfView.document = pdfDocument
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
}
}
}
Не буду лгать, я не уверен, почему это работает в таком порядке, я был бы признателен за комментарий от более мудрого ума, чем я, но я надеюсь, что это помогает другим
Я боролся с подобной проблемой, и очень странным и противоречивым поведением autoScales. В моем случае автоматическое масштабирование сработало либо для первого загруженного документа, но не для любых последующих загруженных документов в том же pdfView, или оно работало только для второго загруженного документа.
Я встроил pdfView в UIScrollView, чтобы получить больше контроля над поведением жестов.
Порядок команд, кажется, действительно является ключевым. После большого количества проб и ошибок этот порядок сработал для меня лучше всего:
Загрузить документ
pdfView.document = pdfDocument
Установите режим отображения
pdfView.displayMode = .singlePage
Установите любые ограничения, фон, тень и т. Д.
Внесите изменения в размер pdfView, изменив ограничения
Установить автоматические весы
pdfView.autoScales = true
Установите масштабные коэффициенты
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
Это единственный порядок, в котором все работало в моем случае, и это работало только тогда, когда присутствовали этапы 2, 5 и 6.
Просто используйте pdfview = PDFView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
до pdfView.document = pdfDocument
И удалите эти строки:
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
Настройте pdfView
в viewDidLoad()
и вставь это в viewDidLayoutSubviews()
:
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
Сначала установите minScaleFactor
, затем установите scaleFactor
, который должен быть между minScaleFactor
а также maxScaleFactor
.
Запустите отладку и изменяйте эти значения, пока не получите идеальный размер.
func showPDF(_ dataStr:String){
guard let data = Data(base64Encoded: dataStr) else { return }
let pdfView = PDFView(frame: self.view.bounds)
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
pdfView.autoScales = true
pdfView.displayMode = .singlePageContinuous
pdfView.displaysPageBreaks = true
pdfView.document = PDFDocument(data:data)
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = 1.15
pdfView.scaleFactor = 1.15
self.view.addSubview(pdfView)
}