第 13 章
打造一個以手勢控制的全螢幕相機
iOS 提供兩種讓開發者存取內建相機來照相的方式。最簡單的方式是使用 UIImagePickerViewController
, 我在《iOS 15 App 程式設計實戰心法》一書中有介紹。這個類別非常方便,有內建標準的相機介面。另外可以使用 AVFoundation 來控制內建相機並擷取影像。與 UIImagePickerViewController
相比,AVFoundation 框架更複雜,但對於建立一個全客製化的相機介面來說更具彈性且強大。
在本章中,我們將會看要如何使用 AVFoundation 框架來擷取靜態圖像。你會學習到許多東西,其中包括:
- 使用 AVFoundation 框架來建立相機介面
- 使用前鏡頭與後鏡頭相機來擷取靜態圖像
- 使用手勢辨識器來偵測滑動(swipe)手勢
- 為相機 App 加入縮放功能
- 儲存圖片至照片膠卷
AV Foundation 媒體擷取器的核心是 AVCaptureSession
物件。它控制輸入(例如後置鏡
頭相機)與輸出(例如圖片檔)間的資料流(data flow)。通常要使用 AVFoundation 框架來擷取一個靜態圖片,你需要:
- 取得
AVCaptureDevice
實例來呈現底層的輸入裝置,例如後置鏡頭相機 - 建立裝置的
AVCaptureDeviceInput
實例(instance) - 建立
AVCaptureStillImageOutput
實例來處理靜態圖片輸出 - 使用
AVCaptureSession
來協調輸入與輸出的資料流 - 以 session 來建立一個
AVCaptureVideoPreviewLayer
的實例來顯示相機預覽
我知道你心中會有很多問題。沒有比用真實的專案來解釋觀念更好的方式。我相信經過這個範例之後,你會對 AVFoundation 框架瞭解更加透徹。
App 範例
我們準備建立簡單的相機 App,提供全螢幕的體驗,與手勢為主的控制。這個 App 提供一個簡約版的 UI,並在畫面底部加上一個擷取按鈕。使用者可以滑動畫面來切換前後相機鏡頭。這個相機提供最大 5x 的數位變焦。使用者可以從左邊滑動畫面到右邊來放大(zoom in),或由右至左來縮小(zoom out)。
當使用者按下擷取按鈕,它以全解析度擷取照片。另外也可以讓使用者儲存至相簿。
本文摘自《iOS 17 App程式設計進階攻略》一書。如果你想繼續閱讀和下載完整程式碼,你可以從AppCoda網站購買完整電子版,全書範例檔皆可下載。