亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

掃描二維碼控件的封裝iOS實現

2020-07-26 03:16:49
字體:
來源:轉載
供稿:網友

掃描二維碼效果

 

源碼:https://github.com/YouXianMing/Animations 

//// QRCodeView.h// QRCode//// Created by YouXianMing on 16/7/7.// Copyright © 2016年 XianMing You. All rights reserved.//#import <UIKit/UIKit.h>#import <AVFoundation/AVFoundation.h>@class QRCodeView;@protocol QRCodeViewDelegate <NSObject>@optional/** * 獲取QR的掃描結果 * * @param codeView QRCodeView實體對象 * @param codeString 掃描字符串 */- (void)QRCodeView:(QRCodeView *)codeView codeString:(NSString *)codeString;@end@interface QRCodeView : UIView/** * 代理 */@property (nonatomic, weak) id <QRCodeViewDelegate> delegate;/** * 燈的狀態,默認為關閉 */@property (nonatomic) AVCaptureTorchMode torchMode;/** * 敏感區域,如果不設置,則為全部掃描區域 */@property (nonatomic) CGRect interestArea;/** * 你用來添加自定義控件的view,尺寸與當前初始化的view一致 */@property (nonatomic, strong) UIView *contentView;/** * 正在運行當中 */@property (nonatomic, readonly) BOOL isRunning;/** * 開始掃描 * * @return 如果成功,則返回YES,否則返回NO */- (BOOL)start;/** * 結束掃描 */- (void)stop;@end
//// QRCodeView.m// QRCode//// Created by YouXianMing on 16/7/7.// Copyright © 2016年 XianMing You. All rights reserved.//#import "QRCodeView.h"@interface QRCodeView () <AVCaptureMetadataOutputObjectsDelegate>@property (nonatomic) BOOL         isRunning;@property (nonatomic, strong) UIView      *videoView;@property (nonatomic, strong) AVCaptureDeviceInput  *deviceInput;@property (nonatomic, strong) AVCaptureDevice    *captureDevice;@property (nonatomic, strong) AVCaptureSession   *captureSession;@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;@property (nonatomic, strong) AVCaptureMetadataOutput  *captureMetadataOutput;@end@implementation QRCodeView- (instancetype)initWithFrame:(CGRect)frame {  if (self = [super initWithFrame:frame]) {    self.videoView = [[UIView alloc] initWithFrame:self.bounds];  [self addSubview:self.videoView];    self.contentView = [[UIView alloc] initWithFrame:self.bounds];  [self addSubview:self.contentView];    self.captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];    _torchMode = AVCaptureTorchModeOff;    [self addNotificationCenter]; }  return self;}#pragma mark - NSNotificationCenter related.- (void)addNotificationCenter {  [[NSNotificationCenter defaultCenter] addObserver:self            selector:@selector(notificationCenterEvent:)             name:AVCaptureInputPortFormatDescriptionDidChangeNotification            object:nil];}- (void)removeNotificationCenter {  [[NSNotificationCenter defaultCenter] removeObserver:self             name:AVCaptureInputPortFormatDescriptionDidChangeNotification             object:nil];}- (void)notificationCenterEvent:(NSNotification *)sender {  if (self.interestArea.size.width && self.interestArea.size.height) {    self.captureMetadataOutput.rectOfInterest = [self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.interestArea];   } else {    self.captureMetadataOutput.rectOfInterest = CGRectMake(0, 0, 1, 1); }}#pragma mark - Start & Stop.- (BOOL)start {  // 初始化輸入流 BOOL  result = NO; NSError *error = nil; self.deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:&error]; if (self.deviceInput == nil) {    NSLog(@"%@", error);  return result; }  // 創建會話 self.captureSession = [[AVCaptureSession alloc] init];  // 添加輸入流 [self.captureSession addInput:self.deviceInput];  // 初始化輸出流 self.captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];  // 添加輸出流 [self.captureSession addOutput:self.captureMetadataOutput];  // 創建queue. [self.captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_queue_create(nil, nil)]; self.captureMetadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];  // 創建輸出對象 self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; self.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; self.videoPreviewLayer.frame = self.contentView.bounds; [self.videoView.layer addSublayer:self.videoPreviewLayer];  // 開始 [self.captureSession startRunning]; self.isRunning = YES; result   = YES;  return result;}- (void)stop {  [self.captureSession stopRunning]; self.isRunning  = NO; self.captureSession = nil;}#pragma mark - AVCaptureMetadataOutputObjectsDelegate- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects  fromConnection:(AVCaptureConnection *)connection {  if (metadataObjects.count > 0) {    AVMetadataMachineReadableCodeObject *metadata = metadataObjects.firstObject;  NSString       *result = nil;    if ([metadata.type isEqualToString:AVMetadataObjectTypeQRCode]) {      result = metadata.stringValue;      if (_delegate && [_delegate respondsToSelector:@selector(QRCodeView:codeString:)]) {        [_delegate QRCodeView:self codeString:result];   }  } }}#pragma mark - Setter & Getter.- (void)setTorchMode:(AVCaptureTorchMode)torchMode { _torchMode = torchMode;  if (_deviceInput && [self.captureDevice hasTorch]) {    [self.captureDevice lockForConfiguration:nil];  [self.captureDevice setTorchMode:torchMode];  [self.captureDevice unlockForConfiguration]; }}#pragma mark - System method.- (void)dealloc {  [self stop]; [self removeNotificationCenter];}@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人黄色在线| 精品呦交小u女在线| 亚洲自拍欧美色图| 亚洲在线视频福利| 日本久久久久久久久久久| 欧美日本高清视频| 精品久久久久久中文字幕大豆网| 精品国产一区二区三区在线观看| 亚洲精品wwwww| 国产91精品视频在线观看| 欧美激情手机在线视频| 亚洲精品之草原avav久久| 久久国内精品一国内精品| 亚洲美女中文字幕| 精品国产欧美一区二区五十路| 色噜噜狠狠狠综合曰曰曰| 日韩精品视频免费在线观看| 欧美成人黑人xx视频免费观看| 亚洲美女福利视频网站| 丝袜一区二区三区| 91精品久久久久久久久久久| 亚洲成人黄色网址| 国产一区二区三区丝袜| 欧美激情在线狂野欧美精品| 亚洲免费人成在线视频观看| 日韩av毛片网| 北条麻妃99精品青青久久| 亚洲欧洲一区二区三区在线观看| 日韩精品极品毛片系列视频| 日韩中文娱乐网| 免费97视频在线精品国自产拍| 国产成人亚洲综合| 高清欧美性猛交xxxx黑人猛交| 中文字幕亚洲欧美| 亚洲欧洲日产国产网站| 久久久久久久影视| 最近中文字幕mv在线一区二区三区四区| 日韩av在线网站| 最近2019年日本中文免费字幕| 久热在线中文字幕色999舞| 亚洲国产精品久久久久| 日韩久久免费视频| 国产成人av网| 日韩欧美在线视频| 国产福利视频一区| 日韩av影视在线| 国产精品自拍小视频| 国产aaa精品| 中文字幕亚洲一区在线观看| 久久九九有精品国产23| 欧洲成人免费视频| 国产欧美精品在线| 色婷婷**av毛片一区| 成人情趣片在线观看免费| 日韩国产激情在线| 综合av色偷偷网| 精品久久久久久电影| 91精品久久久久久久久久久久久久| 欧美丝袜一区二区| 亚洲成人激情视频| 国产精品十八以下禁看| 欧美精品18videosex性欧美| 91精品国产自产在线老师啪| 日韩中文字幕免费| 国产精品自产拍在线观| 亚洲成人av中文字幕| 久久久精品亚洲| 午夜精品蜜臀一区二区三区免费| 精品久久中文字幕久久av| 欧美中文字幕在线| 中文.日本.精品| 亚洲3p在线观看| 国产成人av网址| 亚洲精品中文字| 久久久久久中文字幕| 久久久久久久激情视频| 粉嫩老牛aⅴ一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 国产成人精品日本亚洲| 亚洲精品720p| 国产成人精品免高潮在线观看| 日韩女优在线播放| 91精品国产自产在线观看永久| 日韩精品视频免费| 欧美一区二区三区艳史| 国产精品欧美在线| 久久噜噜噜精品国产亚洲综合| 91久久久久久国产精品| 欧美激情一区二区三级高清视频| 亚洲图片在线综合| 中文字幕亚洲欧美日韩高清| 亚洲老司机av| 成人性生交大片免费观看嘿嘿视频| 久色乳综合思思在线视频| 日韩在线观看高清| 亚洲丝袜在线视频| 久久久久久久久网站| 国产精品久久97| 久久亚洲电影天堂| 日韩中文字幕av| 懂色av影视一区二区三区| 日韩av影院在线观看| 2019日本中文字幕| 日韩欧美精品中文字幕| 国产精品69精品一区二区三区| 91chinesevideo永久地址| 青草青草久热精品视频在线网站| 亚洲区免费影片| 亚洲电影在线看| 日韩欧美亚洲一二三区| 国产成人综合一区二区三区| 色综合色综合久久综合频道88| 国产成人a亚洲精品| 欧美日韩不卡合集视频| 欧美日韩不卡合集视频| 亚洲精品国产欧美| 亚洲第一天堂av| 成人观看高清在线观看免费| 亚洲福利在线观看| 亚洲福利小视频| 91在线播放国产| 好吊成人免视频| 日韩天堂在线视频| 2021久久精品国产99国产精品| 97久久精品在线| 久久九九国产精品怡红院| 超碰精品一区二区三区乱码| 国产精品网站大全| 欧美激情一区二区三区久久久| 一区二区三区动漫| 久久久国产一区二区三区| 国产综合在线看| 成人黄色av免费在线观看| 亚洲第一区中文字幕| 日韩在线免费av| 国产精品99久久99久久久二8| 日韩激情视频在线| 国产主播喷水一区二区| 91免费在线视频网站| 国产精品久久久久久久久粉嫩av| 九九热r在线视频精品| 亚洲无av在线中文字幕| 亚洲美女动态图120秒| 成人av在线亚洲| 欧美丰满少妇xxxxx| 欧美一乱一性一交一视频| 亚洲桃花岛网站| 国产精品一区二区女厕厕| 中文字幕精品www乱入免费视频| 久久久亚洲精选| 色偷偷噜噜噜亚洲男人| 78色国产精品| 国产欧美韩国高清| 亚洲欧美国产高清va在线播| 欧美精品电影免费在线观看| 国产网站欧美日韩免费精品在线观看| 亚洲天堂免费视频| 欧美成人高清视频| 欧美亚洲成人精品| 日韩高清电影免费观看完整| 国产欧美久久一区二区| 日韩免费观看网站| 国语自产精品视频在线看抢先版图片| 日韩女优人人人人射在线视频|