Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使我的扫描仪应用程序看起来像iOS上的Fooducate?_Ios_Objective C_Barcode Scanner - Fatal编程技术网

如何使我的扫描仪应用程序看起来像iOS上的Fooducate?

如何使我的扫描仪应用程序看起来像iOS上的Fooducate?,ios,objective-c,barcode-scanner,Ios,Objective C,Barcode Scanner,Fooducate应用程序(在下面的左边)为他们的扫描仪显示了一个大的视频预览。扫描仪仅在白色箭头之间的明亮区域检测条形码 我的ViewController视图(右下方)有一个子视图,显示AVCaptureVideoPreviewLayer。视频预览只显示在那里 如何使我的视频预览看起来像他们的,并且只在非灰色区域进行目标扫描 用于 import UIKit import AVFoundation class Scanner: NSObject, AVCaptureMetadataOutput

Fooducate应用程序(在下面的左边)为他们的扫描仪显示了一个大的视频预览。扫描仪仅在白色箭头之间的明亮区域检测条形码

我的ViewController视图(右下方)有一个子视图,显示AVCaptureVideoPreviewLayer。视频预览只显示在那里

如何使我的视频预览看起来像他们的,并且只在非灰色区域进行目标扫描

用于

import UIKit
import AVFoundation

class Scanner: NSObject, AVCaptureMetadataOutputObjectsDelegate {

var device: AVCaptureDevice?
var metadata: AVCaptureMetadataOutput = AVCaptureMetadataOutput()
var cameraLayer: AVCaptureVideoPreviewLayer!
var session: AVCaptureSession = AVCaptureSession()
var videoIn: AVCaptureDeviceInput?
var queue : dispatch_queue_t

init() {
    cameraLayer = AVCaptureVideoPreviewLayer(session: session)
    cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    queue = dispatch_queue_create("com.zombie.shopper.queue", DISPATCH_QUEUE_SERIAL)
    println("scanner init")
}

func setupScanner() {
    device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    if !device {
        println("No video device found!")
        return
    }

    var error: NSErrorPointer = nil
    videoIn = AVCaptureDeviceInput(device: device, error: error)
    if session.canAddInput(videoIn) {
        session.addInput(videoIn)
    }
    if session.canAddOutput(metadata) {
        session.addOutput(metadata)
    }

    metadata.setMetadataObjectsDelegate(self, queue: queue)
    metadata.metadataObjectTypes = [AVMetadataObjectTypeUPCECode,
                                    AVMetadataObjectTypeEAN13Code  // UPC-A
                                    ];
}

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects:      AnyObject[]!, fromConnection connection: AVCaptureConnection!) {
    if (metadataObjects.count > 0) {
        println("beep: \(metadataObjects.count), start index: \(metadataObjects.startIndex)")
        println("[0] = \(metadataObjects[0])")
    }
}
}
下面是它的视觉布局。下面的previewView是故事板中的IBOutlet

  scanner.cameraLayer.frame = previewView.bounds
  previewView.layer.addSublayer(scanner.cameraLayer)

假设您的会话设置了以下内容:

AVCaptureSession *session = ...
...
AVCaptureMetadataOutput *output = ...
avcapturemataoutput
上有一个名为
rectOfIntersect
的属性。根据苹果公司的文档,描述如下:

指定感兴趣的矩形可以提高检测性能 对于某些类型的元数据。边界不为空的元数据对象 将不返回与rectOfInterest的相交

基本上,这将允许您自定义要在其中检测条形码的rect


您可以这样做:
output.rectOfInterest=CGRectMake(x,y,0.5,0.5)
。这将创建一个宽度为预览窗口一半的矩形。默认值为
(0,0,1,1)

您希望实现的最终结果是什么,以及您在实现该结果时遇到了哪些问题?刚刚更新,希望最后的问题能够澄清。我知道如何使视频预览更大。。。那很容易。我不知道如何使扫描像Fooducate一样只显示在非灰色区域。你能在设置视频会话的位置添加代码吗?添加了用于设置AVCaptureVideoPreviewLayers的代码吗?我不清楚。请在右上角显示您的AVAudioSessionCGRectMake(0,0,0.5,0.5)查找对象。我原以为它会在左上角。@drfence,你说得对。它确实在左上角。你得摆弄它。实际上,您可以执行output.rectOfInterest=cameraLayer.bounds,如果您还没有这样做的话,它可以满足您的需要