Swift 4中使用UIImagePickerController调用相机并保存图片的技术咨询
没问题,我来帮你实现这个图片保存的方法,结合你已经写的相机调用代码,下面是完整的解决方案:
实现图片保存的完整方案
首先,得确保你的视图控制器已经遵守了UIImagePickerControllerDelegate和UINavigationControllerDelegate协议,不然代理方法不会被触发:
class YourViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 你已有的相机调用方法 @objc func toggle() { if UIImagePickerController.isSourceTypeAvailable(.camera) { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .camera imagePicker.allowsEditing = true UIApplication.topViewController()?.present(imagePicker, animated: true, completion: nil) } } // 下面是要实现的图片选择完成代理方法 }
接下来,我们需要实现didFinishPickingMediaWithInfo方法,同时处理相册权限请求(因为保存图片到系统相册需要权限):
第一步:导入必要框架
在文件顶部添加Photos框架的导入,用来处理相册相关操作:
import Photos
第二步:实现核心代理方法
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 先关闭相机选择器 picker.dismiss(animated: true) // 获取图片:因为你开启了编辑模式,优先取编辑后的图,没有的话再取原图 guard let selectedImage = info[.editedImage] as? UIImage ?? info[.originalImage] as? UIImage else { print("无法获取拍摄的图片") return } // 请求相册权限并执行保存操作 PHPhotoLibrary.requestAuthorization { status in // 回到主线程处理UI操作 DispatchQueue.main.async { switch status { case .authorized, .limited: // 权限允许,开始保存图片 PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.creationRequestForAsset(from: selectedImage) }) { success, error in if success { // 保存成功,给用户提示 let alert = UIAlertController(title: "保存成功", message: "图片已存入系统相册", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) self.present(alert, animated: true) } else { print("图片保存失败:\(error?.localizedDescription ?? "未知错误")") } } case .denied, .restricted: // 权限被拒绝,引导用户去设置开启 let alert = UIAlertController(title: "权限不足", message: "需要开启相册权限才能保存图片,请前往设置开启", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) alert.addAction(UIAlertAction(title: "去设置", style: .default) { _ in guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return } if UIApplication.shared.canOpenURL(settingsUrl) { UIApplication.shared.open(settingsUrl) } }) self.present(alert, animated: true) case .notDetermined: // 理论上不会走到这里,因为我们已经主动请求了权限 break @unknown default: break } } } }
第三步:补充取消选择的代理方法(提升用户体验)
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true) }
重要注意事项
- 必须在
Info.plist中添加权限描述,否则权限请求会失败或者崩溃。需要添加NSPhotoLibraryAddUsageDescription(仅保存相册的权限描述),值可以写“需要访问相册来保存拍摄的图片”。 - 如果你不需要图片编辑功能,可以把
allowsEditing设为false,代码中直接取info[.originalImage]即可。 - 确保
UIApplication.topViewController()这个自定义方法能正确获取当前最上层的视图控制器,否则相机无法正常弹出。
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

