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

В конечном итоге я просто хочу заполнить PDF-файлом всю ширину экрана без каких-либо полей / пробелов.

IOS PDFKit не заполняет UIView

Был бы признателен за помощь.

ОБНОВЛЕНИЕ: код используется в соответствии с рекомендациями ниже, но в настоящее время не работает:

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

В качестве дополнения я пробовал (безрезультатно): pdfView.autoresizesSubviews = true pdfView.autoresizingMask = [.f flexibleWidth, .f flexibleHeight, .f flexibleTopMargin, .f flexibleLeftMargin]

Nicholas Farmer 27.10.2018 10:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
1
5 760
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Просто используйте 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

Nicholas Farmer 27.10.2018 10:00

пожалуйста, поделитесь иерархией раскадровки.

Mahesh Shahane 27.10.2018 11:30

если вы используете UIView и внутри этого pdfview, вы можете изменить pdfview = PDFView (frame: CGRect (x: 0, y: 0, width: view.frame.width, height: view.frame.height)) на pdfview = PDFView (кадр: CGRect (x: 0, y: 0, ширина: yourView.frame.width, высота: yourView.frame.height))

Mahesh Shahane 27.10.2018 11:31

Привет, Махеш, извиняюсь за задержку отдыха, я не смог добраться до своего компьютера. К сожалению, это не работает. Я действительно пробовал это, прежде чем размещать комментарий выше, но снова устал и никакого эффекта. Ive также попытался удалить ограничения из pdfView, но безрезультатно. Буду признателен за любую дополнительную помощь, я очень хочу дать вам награду!

Nicholas Farmer 28.10.2018 11:59

@MaheshShahane Привет, не могли бы вы мне помочь?

Ekta Padaliya 27.08.2019 13:47

@EktaPadaliya что тебе нужно? дайте мне знать.

Mahesh Shahane 28.08.2019 14:03
Ответ принят как подходящий

Да, во-первых, большое спасибо Махешу. Хотя его ответ не дал прямого ответа на мой вопрос, они сказали две вещи, которые помогли решить эту проблему.

В целом, чтобы установить 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

        }
    } 
}

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

работает отлично.

MK iOS 11.02.2021 13:27

Николас Фармер может проверить следующий пример для меня и сообщить решение для меня, здесь я хочу сделать то же самое. Ссылка -github.com/MallikarjunH/TestPDFFullScreen1.git

MK iOS 22.03.2021 12:32

В моем коде / требовании требуется отображение одной страницы, т.е. pdfView.displayMode = .singlePage

MK iOS 22.03.2021 12:33

Уважаемый MK, извините, у меня нет времени скачать и просмотреть. Опубликовать как отдельный вопрос со всем кодом

Nicholas Farmer 23.03.2021 14:40

Николас Фармер - вот ссылка на новый вопрос - stackoverflow.com/questions/66219028/…

MK iOS 24.03.2021 05:39

Я боролся с аналогичной проблемой и очень странным и непоследовательным поведением autoScales. В моем случае автоматическое масштабирование работало либо с первым загруженным документом, но не с любыми последующими загруженными документами в том же pdfView, либо оно работало только со вторым загруженным документом.

Я встроил pdfView в UIScrollView, чтобы получить больший контроль над поведением жеста.

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

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

    pdfView.document = pdfDocument

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

    pdfView.displayMode = .singlePage

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

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

  5. Установить autoScales

    pdfView.autoScales = true

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

    pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit

Это единственный порядок, в котором все работало в моем случае, и он работал только тогда, когда присутствовали все этапы 2, 5 и 6.

Привет, я хочу отобразить свой PDF-файл в режиме просмотра с фиксированным размером.

Ekta Padaliya 27.08.2019 13:43

Привет, Экта, рассматривали ли вы возможность размещения PDFView в пользовательском UIScrollView? Это то, что я сделал, и у меня было гораздо больше контроля над этим.

Ron Regev 28.08.2019 14:45

Установите 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)
}

Другие вопросы по теме