swift3 访问相册和摄像头

第一步:需要在项目中的Info.plist中添加相应的键
访问相册:Privacy - Photo Library Usage Description
访问摄像头:Privacy - Camera Usage Description
它们对应的值可以随意填写,但是其值是显示给用户的信息
值的作用

第二步:请求访问
这里写图片描述
***注意:如果用button设置接收图片,则此button的类型不能为系统样式,即 addImageBtn.buttonType = .system 是无法设置成功的。 求大手告诉原因~~
这个例子中一整个图片添加是一个Button点击触发选择图片事件
首先要遵守UIImagePickerControllerDelegate,和UINavigationControllerDelegate
然后在button点击触发的事件中添加如下代码

@IBAction func chosePhoto(_ sender: UIButton) {
        guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary)else{    //如果是要访问相机只需要将.photoLibrary改为.camera即可
            print("无法获得相册授权")
            return
        }
        let picker = UIImagePickerController()
        picker.allowsEditing = false   //不允许编辑图片
        picker.sourceType = .photoLibrary //选择器访问的是相册(如果是访问相机则将.photoLibrary改为.camera)
        picker.delegate = self   //设置代理
        self.present(picker, animated: true, completion: nil)//以模态视图弹出选择器
    }

guard 的作用是保证应用获得用户授权之后才能访问相册
第三步:访问完相册之后就要让在相册中被点击的图片设置为Button的图片

//必须要先设置picker的代理
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

//被点击的图片的信息保存在info字典中
       self.albumBtn.setImage(info[UIImagePickerControllerOriginalImage] as? UIImage, for: .normal)

        self.albumBtn.imageView?.contentMode = .scaleAspectFill
        self.albumBtn.imageView?.clipsToBounds = true

        dismiss(animated: true, completion: nil)
    }

结果:
这里写图片描述

5.15更新****************************************
之前的版本里在打开相册的时候只能选择图片而不能选择视频,这是因为UIImagePickerViewController.mediaTypes为设置,当mediaTypes没设置的时候默认为kUTTypeImage ,即:只选择图片
所以当要选择视频的时候只需要将mediaTypes 设置为 kUTTypeMovie即可
例:

let picker = UIImagePickerController()
        picker.delegate = self
        picker.allowsEditing = true
        picker.sourceType = .photoLibrary
        picker.mediaTypes = [kUTTypeMovie as String , kUTTypeImage as String]   //可以选择视频 和 图片

        present(picker, animated: true, completion: nil)

然后在 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])方法中判断选择的是图片还是视频之后在做需要做的操作
例:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        let type = info[UIImagePickerControllerMediaType] as? String          //获取所选中项目的类型
        if type == kUTTypeMovie as String{                               //判断选中的是图片还是视频
            let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL

            self.dismiss(animated: true, completion: nil)
            //写出你要做的操作,我这里的示例是做的共享的操作
            let activityViewController = UIActivityViewController(activityItems: [videoURL], applicationActivities: nil)
            activityViewController.popoverPresentationController?.sourceView = self.view
            self.present(activityViewController, animated: true, completion: nil)
        }else{
            let image = info[UIImagePickerControllerOriginalImage] as! UIImage
            self.selectedImage = image
            self.dismiss(animated: true, completion: nil)
            let shareVC = UIActivityViewController(activityItems: [image], applicationActivities: nil)

            shareVC.popoverPresentationController?.sourceView = self.view
            present(shareVC, animated: true, completion: nil)
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SwiftUI中连接WiFi摄像头需要使用AVFoundation框架和自定义视图。以下是一个简单的示例代码,可以帮助您连接WiFi摄像头: 首先,创建一个名为CameraView的自定义视图,用于显示摄像头捕获的视频: ```swift import SwiftUI import AVFoundation struct CameraView: UIViewRepresentable { func makeUIView(context: Context) -> AVCaptureVideoPreviewLayer { // 创建会话 let captureSession = AVCaptureSession() // 查找并设置摄像头设备 guard let camera = AVCaptureDevice.default(for: .video) else { fatalError("无法访问摄像头设备") } do { // 创建输入流 let cameraInput = try AVCaptureDeviceInput(device: camera) // 将输入流添加到会话中 if captureSession.canAddInput(cameraInput) { captureSession.addInput(cameraInput) } // 创建预览图层 let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) previewLayer.videoGravity = .resizeAspectFill // 启动会话 captureSession.startRunning() return previewLayer } catch { fatalError("无法创建摄像头输入流:\(error.localizedDescription)") } } func updateUIView(_ uiView: AVCaptureVideoPreviewLayer, context: Context) { // 更新视图(如果有需要) } } ``` 然后,在您的视图中使用CameraView来显示摄像头画面: ```swift import SwiftUI struct ContentView: View { var body: some View { VStack { CameraView() .frame(height: 300) // 其他视图元素 // ... } } } ``` 在上面的示例中,我们首先创建了一个名为CameraView的自定义视图,实现了UIViewRepresentable协议。在makeUIView方法中,我们创建了一个AVCaptureSession对象,并查找并设置摄像头设备。然后,我们创建了一个AVCaptureVideoPreviewLayer对象作为预览图层,并将其添加到会话中。最后,我们返回这个预览图层作为UIView。 然后,在ContentView中,我们使用CameraView来显示摄像头捕获的视频。您可以根据需要调整CameraView的大小和其他视图元素。 请注意,上述代码只是一个简单的示例,实际应用中可能需要处理更多的逻辑,例如权限检查、连接认证等。此外,还需要根据特定摄像头设备的API和协议进行相应的配置和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值