二維碼通常可以包含以下內(nèi)容
二維碼具有非常廣泛的應用
生成原理
生成步驟
生成的二維碼的效果圖

具體代碼實現(xiàn)
通過storyboard創(chuàng)建兩個imageView,分別用來展示二維碼圖片和頭像

擁有展示二維碼圖片的imageView
@PRoperty (weak, nonatomic) IBOutlet UIImageView *imageView;生成二維碼
/**點擊屏幕的時候顯示二維碼*/- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //1.創(chuàng)建濾鏡 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //2.恢復默認 [filter setDefaults]; //3.給濾鏡添加數(shù)據(jù) NSString *dataString = @"http://www.survivalescaperooms.com/theDesertIslandOutOfTheWorld/";// NSString *dataString = @"世俗孤島"; //將數(shù)據(jù)轉(zhuǎn)換成NSData類型 NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; //通過KVC設置濾鏡的二維碼輸入信息 [filter setValue:data forKey:@"inputMessage"]; //4.獲取輸出的二維碼圖片(CIImage類型) CIImage *outImage = [filter outputImage]; //將CIImage類型的圖片裝換成UIImage類型的圖片 UIImage *image = [UIImage imageWithCIImage:outImage]; //5.顯示二維碼圖片 self.imageView.image = image;}通過二維碼掃描工具,可以掃描生成的二維碼
注意:
二維碼掃描的過程
過程分析
通過攝像頭掃描二維碼信息需要用到AVCapturesession類
二維碼的生成過程
通過成員屬性保存輸入源與輸出端的協(xié)調(diào)者(AVCaptureSession對象)
@property (nonatomic, weak) AVCaptureSession *session;通過成員屬性保存展示通過輸入設備輸入的元數(shù)據(jù)的圖層,用于在適當?shù)臅r候移除圖層
@property (nonatomic, weak) AVCaptureVideoPreviewLayer *layer;創(chuàng)建AVCaptureSession類的對象(簡稱:捕獲對象),用于捕獲音頻/視頻端口的數(shù)據(jù)
AVCaptureSession *session = [[AVCaptureSession alloc] init];self.session = session;給捕獲對象添加輸入設備(通常是攝像頭)
//設置輸入設備輸入數(shù)據(jù)的類型(視頻)AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];[session addInput:input];給捕獲對象添加輸出端
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//設置代理[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];[session addOutput:output];設置輸入源的過濾條件(只獲取二維碼信息)
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];將捕獲的原始數(shù)據(jù)顯示到控制器的view上
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];layer.frame = self.view.bounds;[self.view.layer addSublayer:layer];開始獲取數(shù)據(jù)
[session startRunning];實現(xiàn)輸出端的代理方法,監(jiān)聽捕獲過程
- (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(@"沒有掃描到數(shù)據(jù)"); }}新聞熱點
疑難解答