QuickLook框架詳細(xì)解析(四) —— QuickLook預(yù)覽和縮略圖擴(kuò)展的實(shí)現(xiàn)(一)

版本記錄

版本號 時(shí)間
V1.0 2021.03.22 星期一

前言

QuickLook框架提供了文檔的預(yù)覽功能残家。接下來幾篇我們就一起看一下這個(gè)框架激蹲。感興趣的可以看下面幾篇夯膀。
1. QuickLook框架詳細(xì)解析(一) —— 基本概覽(一)
2. QuickLook框架詳細(xì)解析(二) —— QuickLook 預(yù)覽簡單示例(一)
3. QuickLook框架詳細(xì)解析(三) —— QuickLook 預(yù)覽簡單示例(二)

開始

首先看下寫作內(nèi)容:

了解如何構(gòu)建自己的Quick Look預(yù)覽和縮略圖擴(kuò)展名以在iOS中顯示自定義文件類型鲸匿。內(nèi)容來自翻譯逗抑。

下面就是寫作環(huán)境:

Swift 5, iOS 14, Xcode 12

接著就是正文啦弦疮。

您可能會(huì)發(fā)現(xiàn)自己想要在應(yīng)用程序中顯示文件的縮略圖夹攒,或者甚至想要顯示文件本身的更豐富的預(yù)覽。 幸運(yùn)的是胁塞,QuickLook框架使您可以輕松生成縮略圖并顯示許多標(biāo)準(zhǔn)文件類型的預(yù)覽咏尝。

雖然這對標(biāo)準(zhǔn)文件類型非常有用,但是如果您的應(yīng)用程序?qū)W⒂?code>QuickLook不能涵蓋的特定文件類型啸罢,該怎么辦编检?好吧,不要害怕扰才。借助iOS 13中引入的Quick Look previewsthumbnail extension點(diǎn)允懂,您可以在自己的應(yīng)用程序以及也使用QuickLook的同一設(shè)備上的任何其他應(yīng)用程序中為自定義文件類型提供自定義預(yù)覽和縮略圖。

注意:您會(huì)看到兩種形式的間距形式训桶,都用于后端QuickLook framework(不帶空格)和面向用戶的Quick Look(帶空格)累驮。名稱中的空格規(guī)則似乎很復(fù)雜,因此我們努力做到平衡舵揭。

在本教程中谤专,您將學(xué)習(xí)如何:

  • 使用QLThumbnailGenerator生成縮略圖
  • 為您的自定義文件格式定義并導(dǎo)出您自己的document type
  • 構(gòu)建自己的Quick Look preview extension
  • 構(gòu)建自己的Thumbnail extension
  • 調(diào)試您在擴(kuò)展extension程序中運(yùn)行的代碼

為此,您將使用RazeThumb午绳,該應(yīng)用程序顯示文件列表并在點(diǎn)按時(shí)顯示每個(gè)文件的Quick Look預(yù)覽置侍。您將增強(qiáng)該應(yīng)用程序,以使用QuickLook顯示代表列表中每個(gè)文件的縮略圖拦焚。最后蜡坊,您將為您的自定義.thumb文件類型添加Quick Look preview extensionThumbnail extension,并在appFiles應(yīng)用程序中看到它赎败。

打開下載項(xiàng)目材料秕衙。然后在啟動(dòng)程序文件夾中打開RazeThumb.xcodeproj

RazeThumb是一個(gè)簡單的文檔瀏覽應(yīng)用程序僵刮。它預(yù)裝了各種包含縮略圖的文件類型据忘。六種格式中的五種是標(biāo)準(zhǔn)文件類型鹦牛。第六種是自定義文件類型,稱為.thumb文件勇吊。

構(gòu)建并運(yùn)行:

該應(yīng)用程序顯示六種不同文件類型的列表曼追,每種文件類型均帶有一個(gè)占位符文檔圖標(biāo)。 輕按每個(gè)文件將顯示QLPreviewController汉规,它顯示文件的預(yù)覽礼殊。 這就是目前所做的全部,但是您將在不斷改進(jìn)該應(yīng)用程序针史。


Adding Quick Look Thumbnails

您要做的第一件事就是增強(qiáng)RazeThumb晶伦,以使用每種文件類型的縮略圖。 當(dāng)前悟民,RazeThumb為每個(gè)文件顯示一個(gè)通用文檔圖標(biāo)坝辫。 QuickLook框架為各種文件類型提供縮略圖篷就,包括圖像射亏,PDF,音頻和視頻竭业。 請查看Apple的文檔Apple’s documentation智润,以獲取有關(guān)Apple支持的其他文件類型的更多詳細(xì)信息。 如果QuickLook無法識別文件類型未辆,它仍會(huì)創(chuàng)建某種占位符縮略圖窟绷。 將縮略圖添加到應(yīng)用后,您將學(xué)到更多有關(guān)此的知識咐柜。

現(xiàn)在兼蜈,是時(shí)候開始修飾RazeThumb了。

打開Document.swift并將import Foundation更改為:

import QuickLook

在文件底部拙友,粘貼以下擴(kuò)展名:

// MARK: - QLThumbnailGenerator
extension Document {
  func generateThumbnail(
    size: CGSize,
    scale: CGFloat,
    completion: @escaping (UIImage) -> Void
  ) {
    if let thumbnail = UIImage(systemName: "doc") {
      completion(thumbnail)
    }
  }
}

上面的代碼是異步縮略圖生成方法的占位符为狸。 現(xiàn)在,它返回文檔系統(tǒng)圖標(biāo)的UIImage遗契。 稍后辐棒,您將替換為對QuickLook框架的請求以生成縮略圖。

接下來牍蜂,打開DocumentThumbnailView.swift并將以下代碼直接粘貼到.groupBoxStyle(PlainGroupBoxStyle())下面:

.onAppear {
  document.generateThumbnail(
    size: thumbnailSize,
    scale: displayScale
  ) { uiImage in
    DispatchQueue.main.async {
      self.thumbnail = Image(uiImage: uiImage)
    }
  }
}

上面的代碼等待視圖出現(xiàn)漾根。 然后,它要求為每個(gè)文件提供縮略圖UIImage鲫竞。 UIImage到達(dá)后辐怕,視圖將使用主線程更新SwiftUI圖像Image。 這是所有用戶界面更新所必需的从绘。

構(gòu)建并運(yùn)行:

您會(huì)看到每個(gè)文件的文檔圖標(biāo)現(xiàn)在要小得多寄疏。 這是因?yàn)槟鷽]有調(diào)整圖像的大小其做。 但是很快,QuickLook框架將為您處理大小調(diào)整赁还。

1. Generating a Quick Look thumbnail

要從QuickLook框架中獲取縮略圖妖泄,您需要使用QLThumbnailGenerator創(chuàng)建一個(gè)QLThumbnailGenerator.Request并執(zhí)行請求。 再次打開Document.swift艘策,并用以下代碼替換generateThumbnail(size:scale:completion :)的內(nèi)容:

// 1
let request = QLThumbnailGenerator.Request(
  fileAt: url,
  size: size,
  scale: scale,
  representationTypes: .all)

// 2
let generator = QLThumbnailGenerator.shared
generator.generateRepresentations(for: request) { thumbnail, _, error in
  // 3
  if let thumbnail = thumbnail {
    print("\(name) thumbnail generated")
    completion(thumbnail.uiImage)
  } else if let error = error {
    print("\(name) - \(error)")
  }
}

在上面的代碼中蹈胡,您將執(zhí)行以下操作:

  • 1) 使用視圖提供的大小和比例以及定義的表示形式類型,創(chuàng)建一個(gè)新的QLThumbnailGenerator.Request朋蔫。 可用的表示形式為.icon罚渐,.lowQualityThumbnail.thumbnail。 在這種情況下驯妄,您需要全部請求并使用最佳選擇荷并。 如果使用所有格式的速度太慢,則可以指定一種格式青扔。
  • 2) 使用.shared生成器源织,您可以啟動(dòng)請求并等待提供縮略圖。
  • 3) 如果generator在完成閉包中傳遞了圖像微猖,則將其傳遞回視圖谈息。 如果收到錯(cuò)誤,請打印錯(cuò)誤消息凛剥。 請記住侠仇,generator最多可以返回三個(gè)不同的圖像,因?yàn)樵撜埱筮m用于所有表示形式犁珠。

構(gòu)建并運(yùn)行:

現(xiàn)在逻炊,您將看到每種文件類型的縮略圖。 不幸的是犁享,QuickLook.thumb文件一無所知余素,因此其縮略圖為空白。

2. Searching messages printed in the Console

現(xiàn)在饼疙,查看“調(diào)試”區(qū)域中的消息溺森。 每個(gè)縮略圖有三種可能的表示形式,因此控制臺(tái)中針對每個(gè)顯示的文檔有三則消息窑眯。

在“調(diào)試”區(qū)域右下角的Filter字段中屏积,鍵入.html。 您會(huì)看到三則消息 —— 一則消息顯示縮略圖已生成磅甩,兩則消息顯示失敗炊林。 這是正常現(xiàn)象卷要,在要求所有表示時(shí)您可以忽略這一點(diǎn)渣聚。 要求所有表示的好處是您將獲得至少一個(gè)可以使用的代表独榴。

現(xiàn)在刪除.html并輸入.pdf。 對于PDF文件奕枝,QuickLook生成了兩個(gè)縮略圖棺榔。 DocumentThumbnailView顯示占位符文檔圖標(biāo),然后使用生成的縮略圖對其進(jìn)行兩次更新隘道。 使用所有表示形式的權(quán)衡是多次更新視圖的額外工作症歇。

替換.pdf并鍵入.thumb。 盡管QuickLook對縮略文件一無所知谭梗,但它至少為您提供了一個(gè)縮略圖忘晤,盡管它是空白的。

現(xiàn)在激捏,花點(diǎn)時(shí)間檢查框架生成的不同縮略圖设塔。 文件zombiethumb.jpghumanthumb.pdfthumbsup.txt生成了文件內(nèi)容的精美縮略圖远舅。 Markdown文件thumbsdown.md的縮略圖以文本形式呈現(xiàn)闰蛔,因?yàn)樵摽蚣懿恢С?code>Markdown展示。

thumbsdown.html文件將一個(gè)通用的HTML圖標(biāo)作為其縮略圖表谊,因?yàn)榭蚣茉O(shè)計(jì)者認(rèn)為渲染HTML以生成實(shí)際的縮略圖效果不佳钞护。

最后盖喷,您已經(jīng)發(fā)現(xiàn)爆办,greenthumb.thumb縮略圖是空白圖像。但是不用擔(dān)心课梳;您將很快解決該問題距辆。

生成縮略圖,給自己一個(gè)很大的“豎起大拇指”暮刃。接下來做下一個(gè)事情跨算。


Defining and Exporting a Document Type

那么,為什么.thumb文件沒有縮略圖椭懊?好吧诸蚕,第一個(gè)問題是系統(tǒng)不知道如何將此文件擴(kuò)展名映射到文檔類型。系統(tǒng)使用Uniform Type Identifiers定義已知的數(shù)據(jù)格式氧猬,同時(shí)還允許您定義自己的專有格式背犯,例如.thumb。您可以按照相同的步驟在將來的項(xiàng)目中實(shí)現(xiàn)新的文件類型盅抚。

1. Defining a Document Type

請按照以下步驟定義新的文檔類型:

  • 在項(xiàng)目導(dǎo)航器中漠魏,選擇頂部的RazeThumb項(xiàng)目圖標(biāo)。
  • Targets下選擇RazeThumb target妄均。
  • 選擇target上方的Info標(biāo)簽柱锹。
  • 單擊Document Types旁邊的顯示三角形以展開該部分哪自。
  • 顯示時(shí)單擊+

使用以下詳細(xì)信息填寫新的文檔類型:

  • Name設(shè)置為Thumb File禁熏。
  • Types設(shè)置為com.raywenderlich.rwthumbfile壤巷。
  • Handler Rank設(shè)置為Owner,因?yàn)榇藨?yīng)用是該文件類型的所有者瞧毙。
  • 單擊顯示Click here to add additional document type properties隙笆。
  • Key設(shè)置為CFBundleTypeRole
  • Type保留為String升筏。
  • 輸入編輯器的值Value撑柔。

查看您的設(shè)置。 它們應(yīng)符合以下顯示的內(nèi)容:

2. Exporting a Document Type

既然您已經(jīng)告訴系統(tǒng)您的應(yīng)用擁有.thumb文檔類型您访,則需要將其導(dǎo)出铅忿,以便其他應(yīng)用可以識別.thumb文件。 這是執(zhí)行此操作的步驟:

  • 單擊Exported Type Identifiers旁邊的顯示三角形灵汪。
  • 點(diǎn)擊顯示的+檀训。
  • 對于Description,鍵入Thumb File享言。
  • 對于Identifier峻凫,鍵入com.raywenderlich.rwthumbfile
  • 對于Conforms To,鍵入public.data览露,public.content荧琼。
  • 對于Extensions,鍵入thumb差牛,這是此新文件類型的文件擴(kuò)展名命锄。

仔細(xì)檢查您的設(shè)置是否符合以下顯示的內(nèi)容:

構(gòu)建并運(yùn)行

在縮略圖上查看greenthumb.thumb。 通過添加和導(dǎo)出文檔類型信息偏化,您使iOS知道了.thumb文件類型脐恩。 默認(rèn)情況下,QuickLook框架會(huì)將應(yīng)用程序圖標(biāo)(如您在主屏幕上看到的那樣)用作縮略圖侦讨,因?yàn)榇藨?yīng)用程序擁有該文件類型驶冒。 因此,RazeThumb應(yīng)用程序圖標(biāo)現(xiàn)在顯示為系統(tǒng)上所有.thumb文件的縮略圖韵卤。 再給自己豎起大拇指骗污!


Quick Look Extensions

因此,現(xiàn)在RazeThumb使用QuickLook框架為每個(gè)文件提供縮略圖怜俐,如果您一個(gè)一個(gè)地點(diǎn)擊每個(gè)文件身堡,您還將看到每個(gè)文件的豐富預(yù)覽,直到進(jìn)入greenthumb.thumb為止:

現(xiàn)在該看看如何利用iOS 13中引入的新擴(kuò)展點(diǎn)來改善.thumb文件的使用體驗(yàn)拍鲤。

1. Adding a Quick Look preview extension

Quick Look預(yù)覽擴(kuò)展程序使您的應(yīng)用程序可以使用完全自定義的視圖控制器替換上述無聊的預(yù)覽贴谎。 RazeThumb不僅可以利用您的擴(kuò)展名汞扎,而且使用已安裝的擴(kuò)展名預(yù)覽.thumb文件,所有安裝的其他應(yīng)用程序都將受益擅这。

要將擴(kuò)展添加到項(xiàng)目中澈魄,請按照下列步驟操作:

  • 在項(xiàng)目導(dǎo)航器中選擇RazeThumb項(xiàng)目。
  • 在列出Targets的窗口底部仲翎,單擊+圖標(biāo)痹扇。
  • Preview中鍵入Filter
  • 雙擊Quick Look Preview Extension溯香,并將其命名為ThumbFilePreview鲫构。
  • 單擊Finish
  • 如果出現(xiàn)提示玫坛,請不要立即激活新的ThumbFilePreview scheme结笨。

RazeThumb應(yīng)用程序的Sources文件夾中有兩個(gè)文件,您的新擴(kuò)展程序?qū)⒃谏深A(yù)覽時(shí)使用這些文件湿镀。 您將使用ThumbFile.swift來加載Thumb文件炕吸,并使用ThumbFileViewController.swiftThumbFile的實(shí)例作為預(yù)覽呈現(xiàn)。

為確保這些文件也包含在新創(chuàng)建的ThumbFilePreview target中勉痴,請按照下列步驟操作:

  • Project navigator中選擇ThumbFile.swift赫模。
  • 打開Xcode右側(cè)的Inspectors,然后單擊文檔圖標(biāo)以顯示File inspector蒸矛。
  • Target Membership部分下瀑罗,選中該框以將文件包括在ThumbFilePreviewRazeThumb目標(biāo)中。
  • 在項(xiàng)目導(dǎo)航器中選擇ThumbFileViewController.swift莉钙,然后重復(fù)上述步驟以再次更Target Membership資格廓脆。

在項(xiàng)目導(dǎo)航器中,展開新的ThumbFilePreview組磁玉。 Xcode添加了名為PreviewViewController.swift,MainInterface.storyboardInfo.plist的文件驾讲。 這些是構(gòu)成擴(kuò)展名的文件蚊伞。

2. Invoking a Quick Look Preview Extension

現(xiàn)在,要正確調(diào)用擴(kuò)展程序吮铭,您需要將其與.thumb文件類型相關(guān)聯(lián)时迫。 為此,請按照以下步驟操作:

  • 打開ThumbFilePreview / Info.plist谓晌。
  • 通過按住Option鍵單擊旁邊的顯示三角形掠拳,展開NSExtension條目及其所有子條目。
  • 將鼠標(biāo)懸停在QLSupportedContentTypes上纸肉,然后單擊出現(xiàn)的+溺欧,在其下方添加一個(gè)項(xiàng)喊熟。
  • Item 0設(shè)置為String,并為其賦予com.raywenderlich.rwthumbfile值姐刁,該值與您之前添加的文檔類型標(biāo)識符匹配芥牌。

現(xiàn)在,系統(tǒng)知道何時(shí)調(diào)用您的擴(kuò)展程序聂使,您需要自定義擴(kuò)展程序提供的預(yù)覽壁拉。 打開PreviewViewController.swift并將其內(nèi)容替換為以下內(nèi)容:

import UIKit
import QuickLook

// 1
class PreviewViewController: ThumbFileViewController, QLPreviewingController {
  // 2
  enum ThumbFilePreviewError: Error {
    case unableToOpenFile(atURL: URL)
  }

  func preparePreviewOfFile(
    at url: URL,
    completionHandler handler: @escaping (Error?) -> Void
  ) {
    // 3
    guard let thumbFile = ThumbFile(from: url) else {
      handler(ThumbFilePreviewError.unableToOpenFile(atURL: url))
      return
    }

    // 4
    self.thumbFile = thumbFile

    // 5
    handler(nil)
  }
}

這是您在上面的代碼中所做的事情:

  • 1) 不是從UIViewController繼承,而是從ThumbFileViewController繼承柏靶,ThumbFileViewController是已經(jīng)知道如何通過分配thumbFile屬性來顯示ThumbFile的視圖控制器弃理。
  • 2) 聲明一個(gè)簡單的錯(cuò)誤類型,該錯(cuò)誤類型可以通知QuickLook加載失敗屎蜓。
  • 3) 在preparePreviewOfFile(at:completionHandler :)內(nèi)部案铺,嘗試從指定位置加載ThumbFile,并在失敗時(shí)返回錯(cuò)誤梆靖。
  • 4) 更新視圖控制器以顯示剛剛加載的縮略圖控汉。
  • 5) 通過傳遞nil錯(cuò)誤,通知提供的處理程序預(yù)覽已成功完成加載返吻。

最后姑子,在再次運(yùn)行該應(yīng)用程序之前,打開ThumbFilePreview / MainInterface.storyboard并刪除默認(rèn)情況下添加的“Hello World”標(biāo)簽测僵。

構(gòu)建并運(yùn)行街佑,然后單擊greenthumb.thumb以調(diào)用您的擴(kuò)展程序:

恭喜你!由于上述工作捍靠,QuickLook框架可以加載您的擴(kuò)展名并生成.thumb文件的更好預(yù)覽沐旨。再給自己豎起大拇指!

3. Adding a Thumbnail Extension

現(xiàn)在RazeThumb可以渲染一個(gè)thumb文件了榨婆,是時(shí)候從該渲染中生成縮略圖了磁携。為此,您可以通過將縮略圖擴(kuò)展名添加到項(xiàng)目中的方式良风,類似于添加最后一個(gè)擴(kuò)展名的方式谊迄。

QuickLook框架使用縮略圖擴(kuò)展名來創(chuàng)建自定義文件類型的縮略圖,然后通過QLThumbnailGenerator將其返回到RazeThumb以及設(shè)備上的任何其他應(yīng)用程序烟央。首先统诺,請按照以下步驟添加下一個(gè)擴(kuò)展名:

  • Project navigator中選擇RazeThumb項(xiàng)目。
  • 在列出Targets的窗口底部疑俭,單擊+圖標(biāo)粮呢,然后在Filter中鍵入Thumbnail
  • 雙擊Thumbnail Extension,并將其命名為ThumbFileThumbnail啄寡。
  • 單擊Finish豪硅。
  • 如果出現(xiàn)提示,請不要立即激活新的ThumbFileThumbnail scheme这难。

Project navigator中舟误,展開新的ThumbFileThumbnail組。Xcode已添加ThumbnailProvider.swiftInfo.plist姻乓。這些是構(gòu)成擴(kuò)展名的文件嵌溢。

4. Invoking a Thumbnail extension

為了調(diào)用Thumbnail擴(kuò)展名,您需要將此縮略圖擴(kuò)展名與.thumb文件類型相關(guān)聯(lián)蹋岩,就像使用預(yù)覽擴(kuò)展名一樣赖草。

  • 打開ThumbFileThumbnail擴(kuò)展文件夾中的Info.plist文件。
  • 通過按住Option鍵單擊旁邊的顯示三角形剪个,展開NSExtension條目及其所有子條目秧骑。
  • 將鼠標(biāo)懸停在QLSupportedContentTypes上,然后單擊出現(xiàn)的+扣囊,在其下方添加一個(gè)item乎折。
  • Item 0設(shè)置為String,并為其賦予com.raywenderlich.rwthumbfile值侵歇,該值與您之前添加的文檔類型標(biāo)識符(document type identifier)匹配骂澄。
  • 可選,您還可以使用QLThumbnailMinimumDimension為縮略圖指定最小尺寸(以點(diǎn)為單位)惕虑。如果縮略圖在Internet瀏覽器選項(xiàng)卡中顯示為像收藏夾中的小圖標(biāo)坟冲,則您可能想使用緩存的縮略圖(例如默認(rèn)的應(yīng)用程序圖標(biāo)),而不是生成的縮略圖(例如markdown文字)溃蔫,因?yàn)榭s略圖可能太復(fù)雜而無法識別小尺寸健提。在此應(yīng)用中,您將不會(huì)使用最小尺寸功能伟叛。

ThumbFilePreview target目標(biāo)一樣私痹,ThumbFileThumbnail target也將使用ThumbFile.swiftThumbFileViewController.swift。 按照之前的相同步驟痪伦,在Project navigator中選擇兩個(gè)快速文件侄榴,并通過在File inspector中選中相應(yīng)的復(fù)選框,將其target memberships更新為包括ThumbFileThumbnail网沾。

接下來,打開ThumbnailProvider.swift并將文件內(nèi)容替換為以下內(nèi)容:

import UIKit
import QuickLookThumbnailing

class ThumbnailProvider: QLThumbnailProvider {
  // 1
  enum ThumbFileThumbnailError: Error {
    case unableToOpenFile(atURL: URL)
  }

  // 2
  override func provideThumbnail(
    for request: QLFileThumbnailRequest,
    _ handler: @escaping (QLThumbnailReply?, Error?) -> Void
  ) {
    // 3
    guard let thumbFile = ThumbFile(from: request.fileURL) else {
      handler(
        nil, 
        ThumbFileThumbnailError.unableToOpenFile(atURL: request.fileURL))
      return
    }

    // 4
    DispatchQueue.main.async {
      // 5
      let image = ThumbFileViewController.generateThumbnail(
        for: thumbFile,
        size: request.maximumSize)

      // 6
      let reply = QLThumbnailReply(contextSize: request.maximumSize) {
        image.draw(in: CGRect(origin: .zero, size: request.maximumSize))
        return true
      }

      // 7
      handler(reply, nil)
    }
  }
}

這里涉及一些步驟:

  • 1) 定義一個(gè)簡單的錯(cuò)誤類型蕊爵,如果需要辉哥,可以將任何失敗描述回QLThumbnailProvider
  • 2) 覆蓋ProvideThumbnail(for:_),以便您可以加載ThumbFile并為QuickLookThumbnailing框架呈現(xiàn)其縮略圖醋旦。
  • 3) 嘗試失敗時(shí)嘗試加載ThumbFile并使用錯(cuò)誤調(diào)用處理程序恒水。
  • 4) QuickLookThumbnailing框架在后臺(tái)線程上調(diào)用此方法。但是為了在屏幕上繪制用戶界面饲齐,您必須位于主線程中钉凌。
  • 5) 使用ThumbFileViewController中的一些現(xiàn)有代碼,使用正確的尺寸構(gòu)造預(yù)覽的UIImage表示形式捂人。
  • 6) 使用生成的縮略圖御雕,創(chuàng)建一個(gè)QLThumbnailReply對象,該對象將圖像縮略圖繪制到提供的上下文中滥搭。
  • 7) 使用回復(fù)對象和nil錯(cuò)誤來調(diào)用處理程序酸纲,以指示成功。

注意:在此示例中瑟匆,您調(diào)度到主隊(duì)列,因?yàn)?code>ThumbFileViewController.generateThumbnail(for:size :)在內(nèi)部使用UIGraphicsImageRenderer(需要使用主線程)。在其他情況下娃肿,您可能直接使用其他繪圖API(例如CoreGraphics)豪嗽,則可能不需要這樣做。

構(gòu)建并運(yùn)行∶嵯螅現(xiàn)在代承,您應(yīng)該會(huì)看到greenthumb.thumb的縮略圖,看起來像是預(yù)覽的微型版本交惯。

祝賀您兩個(gè)偉大的大拇指次泽! RazeThumb應(yīng)用程序已完成。


Trying Out Your Extensions Using the Files App

現(xiàn)在席爽,您已經(jīng)為.thumb文件創(chuàng)建了預(yù)覽擴(kuò)展名和縮略圖擴(kuò)展名意荤,其他應(yīng)用程序?qū)⒖梢允褂迷撐募愋汀T诒静糠种兄欢停梢酝ㄟ^向模擬器添加.thumb文件并使用Files應(yīng)用程序?yàn)g覽到該文件來表明擴(kuò)展程序支持其他應(yīng)用程序玖像。

以下是將縮略圖文件添加到模擬器的步驟:

  • 1) 從模擬器中刪除RazeThumb。這是因?yàn)槟M器會(huì)在收到拇指文件后啟動(dòng)RazeThumb齐饮,但RazeThumb不會(huì)保存文件捐寥。將文件復(fù)制到模擬器后,您將重新安裝該應(yīng)用程序祖驱。
  • 2) 將greenthumb.thumbXcodeFinder拖到模擬器應(yīng)用程序中握恳。這將打開Files應(yīng)用程序以導(dǎo)入文件。選擇將文件保存在On My iPhone上捺僻。
  • 3) 點(diǎn)擊Save返回瀏覽乡洼。
  • 4) 如果選擇了Recents選項(xiàng)卡崇裁,請依次單擊BrowseOn My iPhone以查看剛添加的文件。

由于您刪除了RazeThumb束昵,因此您將不會(huì)看到縮略圖拔稳,并且如果打開文件,則不會(huì)看到預(yù)覽锹雏。

Xcode中巴比,構(gòu)建并運(yùn)行RazeThumb以將其重新安裝到模擬器上。安裝RazeThumb將重新建立縮略圖文件和RazeThumb之間的關(guān)聯(lián)礁遵。這是因?yàn)?code>RazeThumb包括縮略圖文件的預(yù)覽和縮略圖擴(kuò)展名轻绞。

在模擬器中打開Files應(yīng)用程序:

點(diǎn)按On My iPhone,您將看到縮略圖文件的渲染縮略圖榛丢。點(diǎn)擊greenthumb.thumb铲球,文件將呈現(xiàn)其預(yù)覽,就像在RazeThumb應(yīng)用程序中一樣晰赞。多么酷凹诓 ?


Attaching the Debugger to Your Extension

Quick Look預(yù)覽擴(kuò)展和縮略圖擴(kuò)展過程與主應(yīng)用程序分開運(yùn)行掖鱼。它們一起安裝時(shí)然走,它們是完全隔離的,這使系統(tǒng)可以在Quick Look框架中有效地使用它們戏挡,以在設(shè)備上安裝的其他應(yīng)用程序中生成預(yù)覽和縮略圖芍瑞。

在開發(fā)擴(kuò)展程序時(shí),您可能需要設(shè)置一個(gè)斷點(diǎn)并查看其執(zhí)行過程褐墅,但是由于Xcode調(diào)試器只能附加到一個(gè)進(jìn)程一次拆檬,因此必須決定是否將調(diào)試器附加到您的應(yīng)用程序或者擴(kuò)展中。

注意:在撰寫本文時(shí)妥凳,在擴(kuò)展中設(shè)置斷點(diǎn)時(shí)竟贯,Xcode調(diào)試器似乎無法正常工作。一些斷點(diǎn)似乎會(huì)導(dǎo)致運(yùn)行循環(huán)run loop崩潰逝钥。其他時(shí)候屑那,調(diào)試器似乎失去了與擴(kuò)展的連接。您可能必須嘗試幾次此練習(xí)艘款。

首先在ThumbnailProvider.swift文件中持际,在ProvideThumbnail(for:_ :)的開頭guard let thumbFile = ThumbFile(from: request.fileURL)語句處設(shè)置一個(gè)斷點(diǎn)。

如果您構(gòu)建并運(yùn)行RazeThumb并滾動(dòng)直到greenthumb.thumb可見哗咆,您會(huì)注意到調(diào)試器不會(huì)在斷點(diǎn)處停止蜘欲。 不要驚慌。 您可以解決該問題晌柬。

單擊scheme selector中的RazeThumb以查看帶有可用schemes列表的下拉列表芒填。 選擇ThumbFileThumbnail作為scheme呜叫,然后單擊Run空繁。 當(dāng)提示您選擇要啟動(dòng)的應(yīng)用程序時(shí)殿衰,選擇RazeThumb并滾動(dòng)直到greenthumb.thumb可見。 這次盛泡,調(diào)試器應(yīng)在斷點(diǎn)處停止闷祥。

為了獲得更多樂趣,請重新運(yùn)行ThumbFileThumbnail scheme傲诵,而不是選擇Files應(yīng)用程序以查看您的代碼在其他應(yīng)用程序中運(yùn)行凯砍!

您現(xiàn)在已經(jīng)了解了如何為受支持的文件類型和自定義文件類型創(chuàng)建Quick Look縮略圖和預(yù)覽。

以下是您在此過程中涉及的一些關(guān)鍵點(diǎn):

  • 縮略圖是文件內(nèi)容的縮影拴竹。
  • QuickLook框架可以為各種標(biāo)準(zhǔn)文件類型(例如圖像悟衩,音頻,視頻栓拜,文本座泳,PDF等)創(chuàng)建縮略圖和預(yù)覽。
  • 使用擴(kuò)展名幕与,您可以擴(kuò)展QuickLook框架以支持您自己的自定義文件類型挑势。
  • 擴(kuò)展程序允許設(shè)備上的所有應(yīng)用程序訪問其功能。
  • 擴(kuò)展程序與應(yīng)用程序分開運(yùn)行啦鸣。
  • 您可以在開發(fā)過程中將Xcode調(diào)試器附加到擴(kuò)展程序潮饱。

如果您想了解更多信息,可以探索許多相關(guān)主題:

后記

本篇主要講述了QuickLook預(yù)覽和縮略圖擴(kuò)展的實(shí)現(xiàn)证鸥,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市勤晚,隨后出現(xiàn)的幾起案子枉层,更是在濱河造成了極大的恐慌,老刑警劉巖赐写,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟蜡,死亡現(xiàn)場離奇詭異,居然都是意外死亡挺邀,警方通過查閱死者的電腦和手機(jī)揉忘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門跳座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泣矛,你說我怎么就攤上這事疲眷。” “怎么了您朽?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵狂丝,是天一觀的道長。 經(jīng)常有香客問我哗总,道長几颜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任讯屈,我火速辦了婚禮蛋哭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涮母。我一直安慰自己谆趾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布哈蝇。 她就那樣靜靜地躺著棺妓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炮赦。 梳的紋絲不亂的頭發(fā)上怜跑,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音吠勘,去河邊找鬼性芬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剧防,可吹牛的內(nèi)容都是我干的植锉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼峭拘,長吁一口氣:“原來是場噩夢啊……” “哼俊庇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸡挠,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辉饱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拣展,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彭沼,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年备埃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姓惑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐奴。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖于毙,靈堂內(nèi)的尸體忽然破棺而出敦冬,到底是詐尸還是另有隱情,我是刑警寧澤望众,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布匪补,位于F島的核電站,受9級特大地震影響烂翰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚤氏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一甘耿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竿滨,春花似錦佳恬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贰剥,卻和暖如春倾剿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚌成。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工前痘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人担忧。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓芹缔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓶盛。 傳聞我的和親對象是個(gè)殘疾皇子最欠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容