在 App 開發中經常會遇到用戶上傳頭像或者添加圖片的需求。通常,用戶可以選擇拍照或者從系統相冊上傳兩種方式。iOS 中為這個功能提供了 UIImagePickerController 這個類來實現對圖片選取的功能。
第一步:實現 UIImagePickerControllerDelegate 協議
我們需要使用代理模式,擴展當前 ViewController 實現兩個協議,UIImagePickerControllerDelegate 和 UINavigationControllerDelegate。
extension ViewController: UIImagePickerControllerDelegate {
// 用戶選取圖片之后
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
// 參數 UIImagePickerControllerOriginalImage 代表選取原圖片,這里使用 UIImagePickerControllerEditedImage 代表選取的是經過用戶拉伸后的圖片。
if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
// 這里對選取的圖片進行你需要的操作,通常會調整 ContentMode。
}
// 必須寫這行,否則拍照后點擊重新拍攝或使用時沒有返回效果。
picker.dismiss(animated: true, completion: nil)
}
}
extension UserViewController: UINavigationControllerDelegate {
// 這里可以什么都不寫
}
第二步: 定義 UIImagePickerController
在 ViewController 中定義并且設置 UIImagePickerController。通常會在一個 UIAlertView 中來定義這些操作。
下面是拍照部分的代碼:
// 判斷相機是否可用
if UIImagePickerController.isSourceTypeAvailable(.camera) {
let imagePicker = UIImagePickerController()
// 表示操作為拍照
imagePicker.sourceType = .camera
// 拍照后允許用戶進行編輯
imagePicker.allowsEditing = true
// 也可以設置成視頻
imagePicker.cameraCaptureMode = .photo
// 設置代理為 ViewController,已經實現了協議
imagePicker.delegate = self
// 進入拍照界面
self.present(imagePicker, animated: true, completion: nil)
}else {
// 照相機不可用
}
下面是從相冊中選取的代碼:
let imagePicker = UIImagePickerController()
// 表示操作為進入系統相冊
imagePicker.sourceType = .photoLibrary
// 設置代理為 ViewController
imagePicker.delegate = self
// 允許用戶編輯選擇的圖片
imagePicker.allowsEditing = true
// 進入系統相冊界面
self.present(imagePicker, animated: true, completion: nil)
第三步:在 Info.plist 中添加權限
key: Privacy - Camera Usage Description
value: 詢問用戶可否調用照相機時,給用戶的提示語
key: Privacy - Photo Library Usage Description
value: 詢問用戶可否訪問系統圖庫時,給用的提示語