iOS 横屏原生二维码扫描 swift

来源:互联网 发布:添加hp打印机 usb端口 编辑:程序博客网 时间:2024/06/04 08:57

需求:做一个横屏的二维码,条形码读取器,摄像头可以选择后置,前置摄像头(居然还有前置,好别扭。。)

  • 添加AVFoundation库
import AVFoundation
  • 获取设备
let  deviceArr  = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo);        print("\(deviceArr)");

打印出来的内容是:

[<AVCaptureFigVideoDevice: 0x14ece560 [Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0]>, <AVCaptureFigVideoDevice: 0x14da17c0  [Front Camera] [com.apple.avfoundation.avcapturedevice.built-in_video:1]>]
可以看到数组里有两个设备,Back Camera , Front Camera,前置,后置摄像头。然后就可以选择我们需要的设备。
        for temp  in deviceArr {            let item = temp as! AVCaptureDevice;            if item.position == .Back {//                选取后置摄像头//在这里加入后续代码            }        }
  • 创建输入输出,并设置代理
//代理class ScanVC: UIViewController,AVCaptureMetadataOutputObjectsDelegate 
 do{//                  创建输入                    let input = try AVCaptureDeviceInput(device: item);//                  创建输出                    let output = AVCaptureMetadataOutput();//                  设置代理,在主线程里刷新                    output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue());//。。。。。。。。                }catch{                }
  • 链接对象
//                    初始化链接对象                     session = AVCaptureSession();//                    采集率的质量                    session.sessionPreset = AVCaptureSessionPresetHigh;//                    添加输入和输出                    session.addInput(input);                    session.addOutput(output);//                    设置支持的编码格式                    let typeArr = output.availableMetadataObjectTypes;                    print("本设备所支持的编码格式 = \(typeArr)");                    output.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeQRCode];                    let layer = AVCaptureVideoPreviewLayer(session: session);                    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;//***设置图像输出的方向 ,如果横屏的时候不设置这个属性,拍出的图像会90度角旋转                    layer.connection.videoOrientation = .LandscapeLeft;                    layer.frame = self.view.bounds;                    self.view.layer.insertSublayer(layer, atIndex: 0);                    session.startRunning();
metadataObjectTypes,对于所有的编码格式,可以看下面的图。

这里写图片描述

  • 代理,读取二维码的内容
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {        if metadataObjects.count > 0 {            session.stopRunning();            let metadataObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject;            print("\(metadataObject.stringValue)");        }    }
  • 扫描区域的设置
output.rectOfInterest = CGRectMake(            (screenWidth - 260) / 2 / screenWidth,            (screenHeight  - 200) / 2 / screenHeight,            260 / screenWidth,            200 / screenHeight);/*! @property rectOfInterest @abstract    Specifies a rectangle of interest for limiting the search area for visual metadata. @discussion    The value of this property is a CGRect that determines the receiver's rectangle of interest for each frame of video.      The rectangle's origin is top left and is relative to the coordinate space of the device providing the metadata.  Specifying     a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the     value CGRectMake(0, 0, 1, 1).  Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned. */@property(nonatomic) CGRect rectOfInterest NS_AVAILABLE_IOS(7_0);

参数的范围都是0-1,前两个是设置范围的坐标原点,后两个是范围大小。对于Landscape Left,屏幕的左下角是起始的原点。比如(0.5,0,0.5,0.5),扫描区域是屏幕左下角1/4的区域。如果是(0,0.5,1.0,0.5)扫描区域是屏幕上半部分。

代码下载 : 代码下载

0 0
原创粉丝点击