The QuickLook framework introduced an editing mode

Одна из малоизвестных жемчужин iOS, Quick Look Framework полезна для предварительного просмотра документов в вашем приложении. Во время WWDC 2019 фреймворк получил хорошее обновление с введением режима редактирования.

QLPreviewController - это контроллер, отвечающий за представление содержимого различных типов в контроллере представления. В настоящее время он поддерживает типы файлов изображений, видео, PDF, CSV и iWork.

QLPreviewItemEditingMode - это новое дополнение к платформе, которое позволяет нам комментировать изображения и PDF-файлы, а также легко обрезать или конвертировать видео.

QLPreviewItemEditingMode включает фреймворк PencilKit для редактирования изображений и PDF-файлов.

Наша цель

  • Изучение новых дополнений в структуре Quick Look
  • Создание приложения для iOS, использующего Quick Look для редактирования документов
  • Сохранение отредактированных документов в каталоге документов с помощью FileManager

Конечный пункт назначения

К концу этой части мы сможем редактировать и сохранять изображения, видео и PDF-файлы, как показано ниже:

Что нового в iOS 13 QuickLook?

Помимо добавления QLPreviewItemEditingMode, протокол QLPreviewControllerDelegate вводит три новых необязательных метода делегирования.

Обработка возможностей режима редактирования

Мы можем справиться с режимом редактирования, реализовав следующий метод:

optional func previewController(_ controller: QLPreviewController, editingModeFor previewItem: QLPreviewItem) -> QLPreviewItemEditingMode

В приведенном выше методе мы можем установить тип возвращаемого значения как createCopy, default или updateContents для обработки результатов редактирования соответственно. updateContents перезаписывает содержимое QLPreviewItems в FileManager. По умолчанию режим редактирования выключен.

Сохранение отредактированного содержимого

После завершения редактирования мы можем сохранить измененное содержимое, используя следующий дополнительный метод:

func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL)

Вышеупомянутый метод срабатывает, когда EditingMode равно createsCopy. Он возвращает URL-адрес измененного содержимого (содержимое находится во временном месте). Затем мы можем выбрать обработку URL-адреса и сохранить его в FileManager.

Уведомление об отредактированном содержании

Мы можем выбрать обновление пользовательского интерфейса после получения уведомления об успешном обновлении QLPreviewItem. Это срабатывает, когда режим редактирования updatesContent:

func previewController(_ controller: QLPreviewController, didUpdateContentsOf previewItem: QLPreviewItem)

В следующем разделе мы создадим простое приложение для iOS, которое запускает предварительный просмотр Quick Look с образцами изображения, видео и PDF, которые доступны вместе с исходным кодом. Просто import QuickLook в вашем ViewController, чтобы начать.

Настройка QLPreviewController

Следующий код используется для представления контроллера Quick Look Preview в ViewController нашего приложения и включения режима редактирования:

@objc func onButtonClick(sender: UIButton){
        
        let previewController = QLPreviewController()
        previewController.dataSource = self
        previewController.delegate = self
        previewController.setEditing(true, animated: true)
        self.present(previewController, animated: true, completion: nil)
}

Затем вам нужно соответствовать протоколам QLPreviewControllerDelegate, QLPreviewControllerDataSource и реализовать функции делегирования в вашем классе.

Настройка нашего источника данных

Для источника данных мы создали массив литералов имен файлов, которые будут использоваться для отображения QLPreviewItems, как показано ниже:

var items : [String] = ["sampleVideo.mp4", "samplePDF.pdf", "sampleImage.png"]

Затем нам нужно реализовать методы протокола источника данных, чтобы отобразить QLPreviewItems. Следующий код отвечает за отображение файлов источников данных в QLPreviewItems:

extension ViewController: QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return items.count
    }
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        
        print(controller.isEditing)
        
        let name = self.items[index]
        let file = name.components(separatedBy: ".")
        let path = Bundle.main.path(forResource: file.first!, ofType: file.last!)
        let url = NSURL(fileURLWithPath: path!)
        return url as QLPreviewItem
    }
}

Сохранение обновленного содержимого

Наконец, мы добавим дополнительные функции делегирования, чтобы сохранить отредактированное содержимое как копию с помощью FileManager:

В приведенном выше коде мы получаем путь к файлу, используя modifiedContentsURL. Используя FileManager, мы сохраняем отредактированный файл в каталог документов нашего приложения.

В результате мы получаем следующее приложение!

Мы настроили наши кнопки, используя новые Системные символы iOS 13.

Заключение

Итак, мы исследовали маленькую жемчужину, которая в значительной степени осталась незамеченной во время WWDC 2019. Режим редактирования Quick Look - интересная функция, поскольку он позволяет нам быстро комментировать PDF-файлы в нашем приложении с помощью встроенного фреймворка PencilKit. Полный исходный код доступен в Репозитории Github.

Вот и все. Надеюсь, вам понравилось читать.