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