SwiftUI 使用相册的实践

本文介绍了如何在SwiftUI应用中实现从相册或相机选择图片并保存到iOS App中。通过创建一个UIViewControllerRepresentable的View来桥接UIKit,实现选择图片的功能。接着,文章详细讲解了如何保存图片到App的沙盒目录,并从沙盒中加载图片。最后,构建了一个包含选择图片和拍照按钮的外层容器,展示了如何使用SwiftUI的Sheet组件来呈现选择界面。
摘要由CSDN通过智能技术生成

目标与计划

目标

假设一个场景,我们的app需要图片,这个图片的来源是相册或者通过拍照获取的,并且要将图片保留在app中,并且希望app打开时能遍历到某个目录下的所有图片,并且加载,以供我们的app使用。

计划

构建一个View,在这个View中选择相册中的图片,或者通过相机拍照
选中的图片保存到app中,并且在app打开时加载指定目录的图片
构造一个外层容器用来装载这个View
计划完成,开始动手写代码

实现

构建从相册/相机选择图片的View

SwiftUI没有这个样的控件,需要使用UIKit中的UIImage这个控件,那么这里需要一个技术,SwifiUI桥接UIKit控件。那么现在不讲原理,只讲如何实现。
定义一个Struct继承UIViewControllerRepresentable,在继承时,需要实现2个func,makeUIViewControllerupdateUIViewController一个是在构造时调用一个是在刷新时被调用.在这个Struct中可以打开相册/相机 (使用摄像头需要在info.plist中添加一个Privacy - Camera Usage Description 的授权描述)

struct ImagePicker: UIViewControllerRepresentable {
   
    @Binding var sourceType:UIImagePickerController.SourceType
        
    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
   
        let picker=UIImagePickerController()
        picker.allowsEditing=false
        picker.sourceType=sourceType
        print("picker source \(sourceType.rawValue)")
        return picker
    }
    
    func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
   
        
    }
                                                                  
    
}

在这段代码中定义了一个ImagePicker的View,继承了UIViewControllerRepresentable,添加了一个sourceType的属性,用来控制图片来源(相册还是相机)。在makeUIViewController函数中,创建UIImagePickerController的实例,并且设置图片是不可编辑的,设置了来源。
我们完成了一个打开相册或者相机的View。但打开之后,选择图片是没有任何反应的,这个就需要我们做另一个事情,添加一个代理处理选照片的这个事件。(具体原理需可查阅UIKit相关文档。这里只实现功能),定义一个类继承NSObject,UINavigationControllerDelegate,UIImagePickerControllerDelegate

struct ImagePicker: UIViewControllerRepresentable {
   
    @Binding var sourceType:UIImagePickerController.SourceType
    let handlerImage:(_ image:UIImage)->Void
    
    func makeCoordinator() -> Coordinator {
   
        return Coordinator(self)
    }
    
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值