You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:22:12