国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > 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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宣威市| 班玛县| 鞍山市| 永新县| 施秉县| 洛扎县| 兴安县| 长岭县| 金川县| 阿拉尔市| 渑池县| 常宁市| 常德市| 同德县| 阳朔县| 崇明县| 庆城县| 莱西市| 曲周县| 济阳县| 香港 | 南宁市| 贞丰县| 清徐县| 琼中| 成安县| 武义县| 台州市| 通辽市| 广饶县| 全南县| 张家口市| 泊头市| 镇远县| 岑溪市| 和林格尔县| 马山县| 都江堰市| 武邑县| 西丰县| 莲花县|