从条形码扫描仪切换后,AVFoundation相机焦点停止工作

时间:2016-07-31 16:22:58

标签: ios swift avfoundation ios-camera

我有一个使用RSBarcodes_Swift扫描条形码的应用程序。 扫描成功后,我需要切换到摄像机视图控制器拍照。我遇到的问题是,在条形码扫描仪后,AVFoundation触摸聚焦停止工作。我的意思是,每当我触摸聚焦时,相机只是短暂地尝试聚焦,然后重置为默认镜头位置。 When i don't use barcode scanner and go directly to camera, everything works fine.我还使用了其他一些条码扫描仪,但结果是一样的。有什么办法让我以某种方式重置相机的使用情况,或者当我完成条形码扫描时dispose

这是我用来展示相机并具有触控功能的代码:

import Foundation
import AVFoundation

public class CameraViewController : UIViewController {

    var backCamera: AVCaptureDevice?
    var captureSession: AVCaptureSession?
    var stillImageOutput: AVCaptureStillImageOutput?
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    var previewView: UIView?

    public override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        previewView = UIView()
        previewView!.frame = UIScreen.mainScreen().bounds

        let shortTap = UITapGestureRecognizer(target: self, action: #selector(shortTapRecognize))

        shortTap.numberOfTapsRequired = 1
        shortTap.numberOfTouchesRequired = 1

        previewView!.addGestureRecognizer(shortTap)

        self.view.addSubview(previewView!)
        captureSession = AVCaptureSession()
        captureSession!.sessionPreset = AVCaptureSessionPresetPhoto

        backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

        var error: NSError?
        var input: AVCaptureDeviceInput!

        do {
            input = try AVCaptureDeviceInput(device: backCamera!)
        } catch let error1 as NSError{
            error = error1
            input = nil
            print(error!.localizedDescription)
        }

        if error == nil && captureSession!.canAddInput(input){
            captureSession!.addInput(input)
            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

            if captureSession!.canAddOutput(stillImageOutput){
                captureSession!.addOutput(stillImageOutput)

                videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                videoPreviewLayer!.frame = previewView!.bounds
                videoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspect
                videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.LandscapeRight
                previewView!.layer.addSublayer(videoPreviewLayer!)
                captureSession!.startRunning()
            }
        }
    }

    public override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    }

    public override func viewDidLoad() {
        super.viewDidLoad()
    }

    public override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func shortTapRecognize(tap: UITapGestureRecognizer){
        if tap.state == UIGestureRecognizerState.Ended {
            let pointInPreview = tap.locationInView(tap.view)
            let pointInCamera = videoPreviewLayer!.captureDevicePointOfInterestForPoint(pointInPreview)

            if backCamera!.focusPointOfInterestSupported{
                do {
                    try backCamera!.lockForConfiguration()
                } catch let error as NSError{
                    print(error.localizedDescription)
                }

                backCamera!.focusPointOfInterest = pointInCamera
                backCamera!.focusMode = .AutoFocus

                backCamera!.unlockForConfiguration()
            }
        }
    }
}

0 个答案:

没有答案