iOS Swift:相机拍照后无法将图片保存至UIImageView的问题
问题分析与解决方案
你遇到的核心问题是:相机拍照完成后,info字典里并不包含UIImagePickerControllerImageURL这个键,所以你的第一个判断分支直接跳过了,导致图片没有设置到UIImageView中。而相册选择的图片是本地已存在的文件,所以这个URL键是存在的,能正常执行后续逻辑。
为什么会这样?
UIImagePickerControllerImageURL(现在更推荐用枚举UIImagePickerController.InfoKey.imageURL)仅适用于从相册/图库中选择已存在的本地图片,它返回的是图片文件在本地的存储路径。而相机拍摄的图片是临时生成的,系统不会直接生成一个本地URL给你,而是直接通过UIImagePickerControllerOriginalImage(对应枚举.originalImage)返回拍摄得到的UIImage对象。
修复后的代码示例
你需要同时兼容相机和相册两种场景,优先通过.originalImage获取图片(这个键在两种场景下都有效),如果有需要再单独处理URL的情况:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 统一获取图片:相机和相册都支持.originalImage键 if let pickedImage = info[.originalImage] as? UIImage { // 替换成你的UIImageView实例 yourImageView.image = pickedImage } // 如果需要处理图片URL(比如要保存到本地、上传服务器等),再单独处理相册场景的URL else if let imageURL = info[.imageURL] as? URL { do { let imageData = try Data(contentsOf: imageURL) if let pickedImage = UIImage(data: imageData) { yourImageView.image = pickedImage } } catch { print("读取图片失败:\(error.localizedDescription)") } } // 别忘了关闭图片选择器 picker.dismiss(animated: true) }
额外提示
- 建议使用
UIImagePickerController.InfoKey枚举代替字符串key,避免拼写错误,同时更符合Swift的类型安全特性。 - 相机拍照时,如果你需要将图片保存到相册,还可以调用
UIImageWriteToSavedPhotosAlbum方法,但要记得请求相册写入权限。
内容的提问来源于stack exchange,提问作者PvDev
相关产品推荐
相关产品推荐

