2015-12-15 2 views
1

Я использую код, предоставленный https://www.hackingwithswift.com/example-code/media/how-to-scan-a-qr-code, чтобы создать собственное приложение для сканирования. Но мне нравится, что мое сканирование происходит при нажатии кнопки. Теперь для этого я поставил viewDidLoad() части из учебника в свою собственную функцию:Как сканировать QR-коды при нажатии кнопки?

func cameraScanningLayer(){ 
    view.backgroundColor = UIColor.blackColor() 
    captureSession = AVCaptureSession() 

    let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    let videoInput: AVCaptureDeviceInput 

    do { 
     videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 
    } catch { 
     return 
    } 

    if (captureSession.canAddInput(videoInput)) { 
     captureSession.addInput(videoInput) 
    } else { 
     failed(); 
     return; 
    } 


    let metadataOutput = AVCaptureMetadataOutput() 

    if (captureSession.canAddOutput(metadataOutput)) { 
     captureSession.addOutput(metadataOutput) 

     metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) 
     // need to scan barcode + QRcode 
     metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code] 
    } else { 
     failed() 
     return 
    } 

    // Previewlayer with camera 
    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
    previewLayer.frame = viewForLayer.bounds; 
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    viewForLayer.layer.addSublayer(previewLayer); 

    captureSession.startRunning(); 
} 

И действие кнопки вызывает функцию:

func buttonScanAction() { 
    print("Scan") 
    scanEnabled = true // like to use some kind of bool/switch 
    self.cameraScanningLayer() 
} 

Проблему я являюсь:

1) При нагрузке камера не видна

2) После нажатия кнопки камера находится в поле зрения, но она всегда автоматически сканирует

Так я думал, используя глобальный:

var scanEnabled: Bool = false 

Затем, когда кнопка нажата, установите его верно и сканирование включено.

Для справки здесь набросок:

enter image description here

EDIT мое быстрое решение, которое не может быть правильный способ сделать это.

Я заменил

let metadataOutput = AVCaptureMetadataOutput() {...} else { 
      failed() 
      return 
     } 

и поместить его между если заявление

if (scanEnabled == true) { 

     let metadataOutput = AVCaptureMetadataOutput() 

     if (captureSession.canAddOutput(metadataOutput)) { 
      captureSession.addOutput(metadataOutput) 

      metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) 
      // to use them both wwe need to skip AVMetadataObjectTypeQRCode 
      metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code] 
      scanEnabled = false 
     } else { 
      failed() 
      return 
     } 
     } 

ответ

2

Автор этого урока здесь. Мой метод состоял в том, чтобы использовать выделенный контроллер просмотра сканирования, но я думаю, вы хотите объединить его с существующим контроллером представлений - и все в порядке. Оба подхода работают.

Если вы хотите постоянно показывать интерфейс камеры (даже если не активно распознавать QR-коды), то ваш план использовать логическое значение для отслеживания включенности сканирования является хорошим. Мой код кода имеет метод foundCode(), который вызывается, а также вызывает dismissViewControllerAnimated(), когда коды найдены.

В вашей версии вам необходимо сделать foundCode() выполнить всю работу по остановке скребка, обработку увольнения и т. Д. Затем вы можете добавить чек для своего scanEnabled boolean в одном месте.

Нечто подобное должно сделать это:

func foundCode(code: String) { 
    if scanCode == true { 
     print(code) 

     captureSession.stopRunning() 
     AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

Если вы хотите, вы можете переместить scanCode == true чек до didOutputMetadataObjects, чтобы сохранить ненужный вызов метода.

+0

tx для вашего учебника. Я проверю, могу ли я поместить предложение вашего кода (используя функцию findcode) для работы в моей «грязной» настройке. Я отредактировал/обновил свой оригинальный quesiton с помощью некоторого кода, который, похоже, выполняет эту работу. BTW: я замечаю, что metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode] добавление типов в массив, похоже, не работает, только первый ObjectType, похоже, распознает ввод. В моем случае у меня есть qr-код и штрих-код, которые я хочу отсканировать. – alex

Смежные вопросы