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, чтобы получить больше контроля над поведением жестов.

Порядок команд, кажется, действительно является ключевым. После большого количества проб и ошибок этот порядок сработал для меня лучше всего:

  1. Загрузить документ

    pdfView.document = pdfDocument

  2. Установите режим отображения

    pdfView.displayMode = .singlePage

  3. Установите любые ограничения, фон, тень и т. Д.

  4. Внесите изменения в размер pdfView, изменив ограничения

  5. Установить автоматические весы

    pdfView.autoScales = true

  6. Установите масштабные коэффициенты

    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)
}
Другие вопросы по тегам