2016-11-07 1 views
2

iOS 10 용 Swift 3 (Xcode 8.1)이 포함 된 QR 코드 스캐너 앱을 제작 중이며 AVFoundation Framework를 사용하고 있습니다. 성공적으로 스캔 한 후 스캔을 중지하고 화면을 가볍게 두드리는 등의 작업을 한 후에 스캐너를 다시 활성화하는 방법을 알고있는 사람이 있습니까? 스캔이 성공한 후 AVFoundation이 중지됩니다.

편집

: 여기 내 코드의 조각입니다 (반환 값에 어떤 일이 발생하는지에 대해 더 코드) :

import UIKit 
import AVFoundation 

@available(iOS 10.0, *) 
class QRCodeViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
var captureSession:AVCaptureSession? 
var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
var qrCodeFrameView:UIView? 

let supportedBarCodes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeAztecCode] 

override func viewDidLoad() { 
    super.viewDidLoad() 

let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    do { 
     let input = try AVCaptureDeviceInput(device: captureDevice) 

     captureSession = AVCaptureSession() 
     captureSession?.addInput(input) 

     let captureMetadataOutput = AVCaptureMetadataOutput() 
     captureSession?.addOutput(captureMetadataOutput) 

     captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 

     captureMetadataOutput.metadataObjectTypes = supportedBarCodes 

     videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
     videoPreviewLayer?.frame = view.layer.bounds 
     view.layer.addSublayer(videoPreviewLayer!) 

     captureSession?.startRunning() 


     qrCodeFrameView = UIView() 

     if case (qrCodeFrameView?.isHidden)! = true  { 
      qrCodeFrameView?.layer.borderColor = UIColor.green.cgColor 
      qrCodeFrameView?.layer.borderWidth = 2 
      view.addSubview(qrCodeFrameView!) 
      view.bringSubview(toFront: qrCodeFrameView!) 
     } 

    } catch { 
     print(error) 
     return 
    } 

} 

override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 
    return UIInterfaceOrientationMask.portrait 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 

    if metadataObjects == nil || metadataObjects.count == 0 { 
     qrCodeFrameView?.frame = CGRect.zero 
     return 
    } 




    let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 


    if supportedBarCodes.contains(metadataObj.type) { 

     let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
     qrCodeFrameView?.frame = barCodeObject!.bounds 
    print(metadataObj.stringValue) 

} 
+0

일부 조각을 공유 할 수 있습니다 코드? –

+0

@MuseerAnsari 질문에 코드를 추가 – Marco

+0

제 답변을 확인하고 문제가 있으면 알려주세요, 감사합니다! –

답변

1

는 대리자 방법이 시도하지

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 

if metadataObjects == nil || metadataObjects.count == 0 { 
    qrCodeFrameView?.frame = CGRect.zero 
    return 
} 

let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 


if supportedBarCodes.contains(metadataObj.type) { 

    let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
    qrCodeFrameView?.frame = barCodeObject!.bounds 
    print(metadataObj.stringValue) 

    // Stop capture session 
    videoPreviewLayer?.isHidden = true 
    qrCodeFrameView?.isHidden = true 
    self.captureSession?.stopRunning() 
} 
+0

고맙습니다. – Marco

+0

안녕하세요. 즐거운 코딩 :) –

+0

멋진, 고마워요, 매력처럼 작동합니다. – Badrinath

관련 문제