如何使用UIImagePickerController创建自定义相机预览视图?

时间:2016-09-15 14:48:22

标签: ios swift camera uiimagepickercontroller

很抱歉,如果这个问题有点广泛,但我一直在寻找几个小时,没有一个适合我这个问题的特定需求的出色解决方案。

对于某些背景信息,我正在处理的iOS应用程序需要相机覆盖(一个掩码图像的png),用户可以将其面部放入并捕获照片,并将遮罩覆盖在顶部它的。相机最初设置在前面,因为主要目的是具有某种自拍功能。点击默认捕获按钮后,相机预览图像将被镜像或反转。

在将照片捕捉到相机预览视图之前,一切看起来都很棒;然而,在捕获之后,它会被镜像或反转。例如,如果我在设置捕捉图片的同时握住我的左手,并且我捕获了该图像,则相机预览看起来就像是在握住我的右手。

在我的研究过程中,我发现了一些不完全符合我需求的解决方案,或者完全解释了我如何解决问题。我的项目完全是用Swift编写的,如果可能的话,管理层希望不惜一切代价保持这种方式。下面,我将列出我找到的解决方案:

  1. 这个项目基本上是我需要的一切;但是,它是用Objective-C编写的:https://github.com/lucasecf/LEMirroredImagePicker
  2. 我遇到的所有其他解决方案要么是完整地创建自定义相机(捕获,取消,使用照片,重新拍摄,相机预览等),要么使用AVFoundation(从未使用过AVFoundation在Swift中没有很多例子。
  3. 这是我到目前为止与UIImagePickerController一起使用的唯一代码:

    var picker = UIImagePickerController()
    
    @IBAction func shootPhoto(_ sender: AnyObject) {
        if UIImagePickerController.availableCaptureModes(for: .front) != nil {
            picker = UIImagePickerController() //make a clean controller
            picker.allowsEditing = false
            picker.sourceType = UIImagePickerControllerSourceType.camera
            picker.cameraCaptureMode = .photo
            picker.cameraDevice = .front
            picker.showsCameraControls = true
    
            //customView stuff
            let customViewController = CustomOverlayViewController(
                nibName:"CustomOverlayViewController",
                bundle: nil)
            let customView:CustomOverlayView = customViewController.view as! CustomOverlayView
            customView.frame = self.picker.view.frame
    
            picker.modalPresentationStyle = .fullScreen
            present(picker,animated: true,completion: {
                self.picker.cameraOverlayView = customView
            })
        } else { //no camera found -- alert the user.
            let alertVC = UIAlertController(
                title: "No Camera",
                message: "Sorry, this device has no camera",
                preferredStyle: .alert)
            let okAction = UIAlertAction(
                title: "OK",
                style:.default,
                handler: nil)
            alertVC.addAction(okAction)
            present(alertVC, animated: true, completion: nil)
        }
    }
    

    所以,如果有人可以提供一个完整的解决方案或以某种方式指导我(虽然,我认为我已经在互联网上看到了所有内容),那真是棒极了!

0 个答案:

没有答案