“`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: 應提示使用者授權的必要性,並在應用程式中提供相應的錯誤處理,讓使用者了解為何需要這些權限。

📷Swift UIImagePickerController | 選擇照片 & 拍照 📷
“`

Categorized in:

Tagged in:

,