照片編輯 APP

protocol, delegate, extension, UIImagePickerController, UIColorPickerViewController, UIGraphicsImageRenderer, UIActivityViewController

--

半成品?:主要練習 delegate,其餘有空再補

▲刪除不少功能,想做濾鏡但耗時便空留提醒未來的自己
▲圖應設 Fill 卻因文字功能被我砍掉,為練習選色改 Fit 成醜背景
▲感恩大大們分享文尤其 Ivan ,其他太多直接貼彼得這大組頭啦
彼得教學透過 delegate or data source 實現 App 功能的步驟說明
▲iOS SDK 選東西的 view controller & delegate 範例也請參考彼得教學

前置作業

▲較特別的是為之後分享(存)照片,圖須放到 ContainerView 裡
▲ ContainerView 背景原設無色出來卻變白底?(右下圖)
➞因為圖非設為 Aspect Fill 而是 Aspect Fit
➞既然如此…只好改成和 View 一樣背景的黑色佯裝😝
▲除 EditImageView 還另增 OriginalImageView 來恢復原始照片
➞ 隱藏 OriginalImageView

▲請求使用者同意使用相機與存照片權限:入 info 加項目並打問句
➞就是第 1 次使用 app 會問你要不要允許那玩意
➞相機功能模擬器無法實測,唯有使用實機才行

透過 data source / delegate 客製功能 :拍照 ,選相簿照片

✅ 指定 data source / delegate 是型別 A 生成的東⻄

▲生成 UIImagePickerController
▲其內建 sourceType 裡有我們要的 album 和 camera (之後設為 alert 選項)
▲將此 ViewController (self) 設為 UIImagePickerController 的 delegate
▲打完出現紅色屬正常,按修正後 protocol 會在class 那行出現

✅ 定義型別 A 遵從 protocol:2 個 protocol (黃框)

✅ 在型別 A 裡定義 protocol 的 function

▲cmd 點 UIImagePickerControllerDelegate 選 Jump to Definition 找功能
➞ protocol 的 function 如前面有 optional ,代表不一定要定義的功能
➞ 反之,一定要定義
▲找到適合 function 後記下關鍵字 didFinish
▲回 ViewController 打 didfi 等會自動出現整個 function 可選

▲ info: [UIImagePickerController.InfoKey : Any]
➞ info 裡有照片,且為 dictionary 寫法 ( key & value 用冒號連接)
▲ cmd 點 InfoKey 選 Jump to Definition 看究竟內建有何物?
▲適合者為 originalImage,因 key 型別一樣可省略只寫 .
▲ dictionary 含不同型別所以 value 型別為 Any,用 as 轉型為 UIImage
▲從相簿選照片後還想執行什麼任務自行撰寫
至於設定 alert 照相或選取相簿照片與其任務請看最下面完整程式碼

extension:使 class 乾淨,程式漂亮好維護

▲原最上面 class 那行後會加上此頁 ViewController 所有 protocol
▲ class 裡也有各個定義 protocol 的 function
▲使用越多畫面越混亂不易查詢觀看

(黃框) protocol,(藍框) function

▲可於最底或另開 File 用 extension 將 protocol 與 function 寫入內

透過 data source / delegate 客製功能 :選取顏色

✅ 指定 data source / delegate 是型別 A 生成的東⻄

▲生成 UIColorPickerViewController
▲將此 Controller 設為 UIColorPickerViewController 的 delegate
▲出現紅色屬正常,按修正後 protocol 會在class 那行出現

✅ 定義型別 A 遵從 protocol:1 個 protocol (黃框)

✅ 在型別 A 裡定義 protocol 的 function

▲cmd 點 UIColorPickerViewControllerDelegate 選 Jump to Definition
▲找到適合 function 後記下關鍵字 didSelect
▲回 ViewController 打 didSe 等會自動出現整個 function 可選

▲剛 Jump to Definition 內提到選取顏色可用 .selectedColor
▲ iOS 15 寫 editImageView.backgroundColor = color 即可

extension:將 protocol (黃框) 與 function (藍框) 拉至最底寫入內

用 UIGraphicsImageRenderer 將 view 變成 UIImage:彼得完整教學

用 UIActivityViewController 分享 (儲存) 圖片

▲產生 UIGraphicsImageRenderer
▲欲將 containerView 畫面變圖片,尺寸便設為 containerView 的 size
▲呼叫 UIGraphicsImageRenderer 的 function image(actions:) 產生圖片
▲呼叫 function drawHierarchy(in:afterScreenUpdates:)
➞將 containerView 內容製成圖片
➞讓 containerView 和它的 subview 出現在圖片裡

完整程式碼

--

--