title: AV Foundation camera scan within box
body: <p><a href="https://i.stack.imgur.com/LrFHJ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/LrFHJ.png" alt="enter image description here"></a></p>
  
  <p>I am able to scan barcode with full camera resolution successfully but i want that it should scan barcodes only within a particular frame(box which is centrally placed). if barcode lies outside that frame it should not scan. </p>
  
  <pre><code>var session         : AVCaptureSession = AVCaptureSession()
      var previewLayer    : AVCaptureVideoPreviewLayer!
      var highlightView   : UIView = UIView()
  
  func opencamera()
      {
        if session.running
          {
  
          }
          else
          {
              session = AVCaptureSession()
  
              // Set the captureDevice.
  
              let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
  
              session.sessionPreset = AVCaptureSessionPresetInputPriority
              // Create input object.
              let videoInput: AVCaptureDeviceInput?
  
              do {
                  videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
              } catch {
                  return
              }
  
              // Add input to the session.
              if (session.canAddInput(videoInput)) {
                  session.addInput(videoInput)
              } else {
                  scanningNotPossible()
              }
              let metadataOutput = AVCaptureMetadataOutput()
  
              // Add output to the session.
              if (session.canAddOutput(metadataOutput)) {
                  session.addOutput(metadataOutput)
  
                  // Send captured data to the delegate object via a serial queue.
                  metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
  
                  // Set barcode type for which to scan: EAN-13.
                  //metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
                  metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeUPCECode,
                                                        AVMetadataObjectTypeCode39Code,
                                                        AVMetadataObjectTypeCode39Mod43Code,
                                                        AVMetadataObjectTypeEAN13Code,
                                                        AVMetadataObjectTypeEAN8Code,
                                                        AVMetadataObjectTypeCode93Code,
                                                        AVMetadataObjectTypeCode128Code,
                                                        AVMetadataObjectTypePDF417Code,
  
                  ]
  
              } else {
                  scanningNotPossible()
              }
              previewLayer = AVCaptureVideoPreviewLayer(session: session);
              previewLayer.frame = self.view.frame
  
              previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
              previewLayer?.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))
                             image.layer.addSublayer(previewLayer);
                              session.startRunning()
          }
      }
      func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
  
          //var highlightViewRect = CGRectZero
  
          // var barCodeObject : AVMetadataObject!
  
          var detectionString : String!
  
          let barCodeTypes = [AVMetadataObjectTypeUPCECode,
                              AVMetadataObjectTypeCode39Code,
                              AVMetadataObjectTypeCode39Mod43Code,
                              AVMetadataObjectTypeEAN13Code,
                              AVMetadataObjectTypeEAN8Code,
                              AVMetadataObjectTypePDF417Code,
                              ]
  
  
          // The scanner is capable of capturing multiple 2-dimensional barcodes in one scan.
          for metadata in metadataObjects {
  
              for barcodeType in barCodeTypes {
  
  
                  let decodedData:  AVMetadataMachineReadableCodeObject =  metadata as! AVMetadataMachineReadableCodeObject
                  if metadata.type == barcodeType {
  
                                             detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue
                      if(metadata.type  == AVMetadataObjectTypeEAN13Code){
                          if (detectionString.hasPrefix("0") &amp;&amp; detectionString.characters.count &gt; 1){
                              detectionString = String(detectionString.characters.dropFirst())
                          }
  
                      }
                      AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
                      self.session.stopRunning()
  
                      break
                  }
  
  
  
              }
          }
  
          print(detectionString)
  
          self.previewLayer.removeFromSuperlayer()
          self.highlightView.removeFromSuperview()
  
      }
  </code></pre>