3
Il affiche uniquement la sortie de l'appareil photo, mais rien ne se passe. Je ne sais pas quel est le problème.QRCode Scanner ne fonctionne pas dans iOS 11, affiche uniquement l'aperçu de la caméra
Mon code est:
class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var captureSession:AVCaptureSession?
var videoPreviewLayer:AVCaptureVideoPreviewLayer?
var qrCodeFrameView:UIView?
let supportedCodeTypes = [AVMetadataObject.ObjectType.qr]
var resultString = ""
override func viewDidLoad() {
super.viewDidLoad()
guard let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) else {return}
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 = supportedCodeTypes
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoPreviewLayer?.frame = view.layer.bounds
view.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
qrCodeFrameView = UIView()
if let qrCodeFrameView = qrCodeFrameView {
qrCodeFrameView.layer.borderColor = UIColor.green.cgColor
qrCodeFrameView.layer.borderWidth = 2
self.view.addSubview(qrCodeFrameView)
self.view.bringSubview(toFront: qrCodeFrameView)
}
captureSession?.startRunning()
} catch {
// If any error occurs, simply print it out and don't continue any more.
print(error)
return
}
}
Délégué:
// MARK: - AVCaptureMetadataOutputObjectsDelegate Methods
func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count == 0 {
qrCodeFrameView?.frame = CGRect.zero
//messageLabel.text = "No QR/barcode is detected"
print("No QR/barcode is detected")
return
}
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if supportedCodeTypes.contains(metadataObj.type) {
let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
qrCodeFrameView?.frame = barCodeObject!.bounds
if metadataObj.stringValue != nil {
print(metadataObj.stringValue as Any)
}
}
}
J'ai essayé de déboguer en mettant des points d'arrêt, mais aucun des points d'arrêt viré dans la méthode déléguée.
Est-ce que quelqu'un sait pourquoi cela se produit-il?
Merci!
devrait être marqué comme doublon vous avez déjà assez réputation pour le faire –
Désolé, je ne savais pas que c'était un double (pas * copie exacte * bien). – the4kman
merci @ the4kman ... !!! –