IOS生成與讀取二維碼名片
一、概述
1、通過(guò)某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號(hào)信息的
2、二維碼通??梢园韵聝?nèi)容
- 純文本
- 名片
- URL
3、二維碼具有非常廣泛的應(yīng)用
- 二維碼名片
- 掃碼付款
- 網(wǎng)址(URL),掃描后自動(dòng)打開(kāi)網(wǎng)址
二、二維碼的生成
1、生成原理
通過(guò)一個(gè)類(lèi)CIFilter(濾鏡)包含二維碼中所有的信息,然后生成一張二維碼圖片
二維碼中間的icon(頭像),是通過(guò)在生成的圖片上添加一張圖片實(shí)現(xiàn)的
2、生成步驟
- 創(chuàng)建濾鏡
- 初始化濾鏡
- 添加二維碼信息
- 獲取生成的二維碼圖片
- 將二維碼圖片展示出來(lái)
3、生成的二維碼的效果圖

4、具體代碼實(shí)現(xiàn)
1)、通過(guò)storyboard創(chuàng)建兩個(gè)imageView,分別用來(lái)展示二維碼圖片和頭像

2)、擁有展示二維碼圖片的imageView
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
3)、生成二維碼
/**點(diǎn)擊屏幕的時(shí)候顯示二維碼*/
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//1.創(chuàng)建濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//2.恢復(fù)默認(rèn)
[filter setDefaults];
//3.給濾鏡添加數(shù)據(jù)
NSString *dataString = @"http://www.xxx.com/theDesertIslandOutOfTheWorld/";
// NSString *dataString = @"世俗孤島";
//將數(shù)據(jù)轉(zhuǎn)換成NSData類(lèi)型
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
//通過(guò)KVC設(shè)置濾鏡的二維碼輸入信息
[filter setValue:data forKey:@"inputMessage"];
//4.獲取輸出的二維碼圖片(CIImage類(lèi)型)
CIImage *outImage = [filter outputImage];
//將CIImage類(lèi)型的圖片裝換成UIImage類(lèi)型的圖片
UIImage *image = [UIImage imageWithCIImage:outImage];
//5.顯示二維碼圖片
self.imageView.image = image;
}
4)、通過(guò)二維碼掃描工具,可以掃描生成的二維碼
若二維碼的輸入信息是URL,則會(huì)打開(kāi)指定的網(wǎng)絡(luò)資源
三、二維碼的掃描
1、注意:
- 二維碼掃碼需要使用攝像頭,需要真機(jī)設(shè)備
- Xcode7可是免費(fèi)真機(jī)調(diào)試
2、二維碼掃描的過(guò)程
- 通過(guò)攝像頭掃描二維碼
- 解析二維碼數(shù)據(jù)
- 根據(jù)二維碼信息執(zhí)行相應(yīng)的操作
3、過(guò)程分析
1)、通過(guò)攝像頭掃描二維碼信息需要用到AVCaptureSession類(lèi)
- 該類(lèi)是用來(lái)協(xié)調(diào)從音頻/視頻輸入端口到輸出端的數(shù)據(jù)
- 該類(lèi)需要一個(gè)輸入設(shè)備AVCaptureDeviceInput,通常是攝像頭
- 該類(lèi)需要一個(gè)輸出端,輸出指定類(lèi)型的數(shù)據(jù),有多個(gè)類(lèi)可以選擇(如:AVCaptureMetadataOutput)
- 需要調(diào)用- startRunning方法開(kāi)啟輸入源
2)、通過(guò)AVCaptureSession類(lèi)捕獲的數(shù)據(jù),可以通過(guò)指定輸出端的過(guò)濾類(lèi)型來(lái)以特定的類(lèi)型解析捕獲的數(shù)據(jù)
3)、可以為輸出端AVCaptureMetadataOutput設(shè)置代理,來(lái)聽(tīng)捕獲過(guò)程
4)、通過(guò)AVCaptureVideoPreviewLayer類(lèi)將獲取的原始數(shù)據(jù)渲染到指定的圖層
4、二維碼的生成過(guò)程
通過(guò)成員屬性保存輸入源與輸出端的協(xié)調(diào)者(AVCaptureSession對(duì)象)
@property (nonatomic, weak) AVCaptureSession *session;
通過(guò)成員屬性保存展示通過(guò)輸入設(shè)備輸入的元數(shù)據(jù)的圖層,用于在適當(dāng)?shù)臅r(shí)候移除圖層
@property (nonatomic, weak) AVCaptureVideoPreviewLayer *layer;
創(chuàng)建AVCaptureSession類(lèi)的對(duì)象(簡(jiǎn)稱(chēng):捕獲對(duì)象),用于捕獲音頻/視頻端口的數(shù)據(jù)
AVCaptureSession *session = [[AVCaptureSession alloc] init]; self.session = session;
給捕獲對(duì)象添加輸入設(shè)備(通常是攝像頭)
//設(shè)置輸入設(shè)備輸入數(shù)據(jù)的類(lèi)型(視頻) AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; [session addInput:input];
給捕獲對(duì)象添加輸出端
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init]; //設(shè)置代理 [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [session addOutput:output];
設(shè)置輸入源的過(guò)濾條件(只獲取二維碼信息)
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
將捕獲的原始數(shù)據(jù)顯示到控制器的view上
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session]; layer.frame = self.view.bounds; [self.view.layer addSublayer:layer];
開(kāi)始獲取數(shù)據(jù)
[session startRunning];
實(shí)現(xiàn)輸出端的代理方法,監(jiān)聽(tīng)捕獲過(guò)程
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0)
{
//獲取輸出端的信息
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"%@", object.stringValue);
//停止掃描
[self.session stopRunning];
//將展示圖層移除
[self.layer removeFromSuperlayer];
}
else
{
NSLog(@"沒(méi)有掃描到數(shù)據(jù)");
}
}
以上就是IOS二維碼名片生成與讀取的詳細(xì)代碼介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。
- iOS和Android用同一個(gè)二維碼實(shí)現(xiàn)跳轉(zhuǎn)下載鏈接的方法
- iOS實(shí)現(xiàn)二維碼的掃描功能
- ios swift3.0實(shí)現(xiàn)二維碼掃描、生成、識(shí)別示例代碼
- IOS筆記061之二維碼的生成和掃描
- ios原生二維碼掃描
- iOS模仿微信長(zhǎng)按識(shí)別二維碼的多種方式
- iOS 條碼及二維碼掃描(從相冊(cè)中讀取條形碼/二維碼)及掃碼過(guò)程中遇到的坑
- iOS自帶原生二維碼掃描的實(shí)現(xiàn)
- iOS 原生實(shí)現(xiàn)掃描二維碼和條形碼功能限制掃描區(qū)域
- iOS第三方框架二維碼生成與掃描
相關(guān)文章
IOS開(kāi)發(fā)之為視圖繪制單(多)個(gè)圓角實(shí)例代碼
這篇文章主要介紹了IOS開(kāi)發(fā)之為視圖繪制單(多)個(gè)圓角實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android中g(shù)etActivity()為null的解決辦法
在Android開(kāi)發(fā)的時(shí)候可能遇過(guò)出現(xiàn)getActivity()出現(xiàn)null的時(shí)候?qū)е鲁绦驁?bào)出空指針異常,那么遇到這種情況改如何解決,下面跟著小編一起去看看。2016-08-08
iOS開(kāi)發(fā)中UIImageView控件的常用操作整理
這篇文章主要介紹了iOS開(kāi)發(fā)中UIImageView控件的常用操作整理,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01
iOS開(kāi)發(fā)中音頻工具類(lèi)的封裝以及音樂(lè)播放器的細(xì)節(jié)控制
這篇文章主要介紹了iOS開(kāi)發(fā)中音頻工具類(lèi)的封裝以及音樂(lè)播放器的細(xì)節(jié)控制,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12

