“`html
📷 Swift UIImagePickerController | 2025 最新選擇照片與拍照教學 📷
在 Swift 中,我們可以使用 UIImagePickerController 來選擇照片或拍照,並將照片存入相簿中。這篇文章將介紹如何使用 UIImagePickerController 來完成這些操作,並提供2025年的最新語法與最佳實踐。
前置準備
在開始之前,我們需要先在 info.plist 中加入以下兩個鍵值:
- NSPhotoLibraryUsageDescription:用於存取相簿的描述
- NSCameraUsageDescription:用於存取相機的描述
接著,我們需要在 ViewController.swift 中加入以下程式碼:
import UIKit
import Photos
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// ...
}
檢查照片庫權限
在選擇照片之前,我們需要檢查使用者是否已授權存取相簿:
func checkPhotoLibraryPermission() {
let status = PHPhotoLibrary.authorizationStatus()
switch status {
case .authorized:
// 已授權存取相簿
break
case .denied, .restricted:
// 拒絕存取相簿
print("存取相簿被拒絕")
break
case .notDetermined:
// 尚未決定是否授權存取相簿
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
// 已授權存取相簿
} else {
// 拒絕存取相簿
print("存取相簿被拒絕")
}
}
}
}
選擇照片
若使用者授權,可以使用 UIImagePickerController 來選擇照片:
func selectPhoto() {
checkPhotoLibraryPermission()
if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
present(imagePicker, animated: true, completion: nil)
}
}
最後,實作 UIImagePickerControllerDelegate 中的 didFinishPickingMediaWithInfo 方法,以取得使用者選擇的照片:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
// 取得使用者選擇的照片
savePhotoToAlbum(image: image) // 儲存照片至相簿
}
picker.dismiss(animated: true, completion: nil)
}
檢查相機權限
接下來,檢查使用者是否允許存取相機:
func checkCameraPermission() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .authorized:
// 已授權存取相機
break
case .denied, .restricted:
// 拒絕存取相機
print("存取相機被拒絕")
break
case .notDetermined:
// 尚未決定是否授權存取相機
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
// 已授權存取相機
} else {
// 拒絕存取相機
print("存取相機被拒絕")
}
}
}
}
拍照
若使用者授權,可以使用 UIImagePickerController 來拍照:
func takePhoto() {
checkCameraPermission()
if UIImagePickerController.isSourceTypeAvailable(.camera) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
imagePicker.allowsEditing = true
present(imagePicker, animated: true, completion: nil)
}
}
同樣地,實作 UIImagePickerControllerDelegate 中的 didFinishPickingMediaWithInfo 方法:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
// 取得使用者拍攝的照片
savePhotoToAlbum(image: image) // 儲存照片至相簿
}
picker.dismiss(animated: true, completion: nil)
}
將照片存入相簿
最後,我們可以使用 PHPhotoLibrary 來將照片存入相簿:
func savePhotoToAlbum(image: UIImage) {
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAsset(from: image)
}) { saved, error in
if saved {
print("照片已存入相簿")
} else {
print("存入相簿失敗:\(String(describing: error))")
}
}
}
總結
在這篇文章中,我們介紹了如何使用 UIImagePickerController 來選擇照片或拍照,並將照片存入相簿中。這些步驟涵蓋了相應的權限檢查及錯誤處理,以確保應用程式的順利運行。
Q&A(常見問題解答)
Q1: 如何檢查使用者是否已授權存取相簿和相機?
A1: 可以使用 PHPhotoLibrary.authorizationStatus()
和 AVCaptureDevice.authorizationStatus(for: .video)
來檢查相應的權限。
Q2: 如何在拍照後自動儲存照片?
A2: 在 imagePickerController(_:didFinishPickingMediaWithInfo:)
方法中,取得照片後,調用 savePhotoToAlbum(image:)
方法來儲存照片。
Q3: 如果使用者拒絕授權,應該怎麼辦?
A3: 應提示使用者授權的必要性,並在應用程式中提供相應的錯誤處理,讓使用者了解為何需要這些權限。
“`
—