iOS實(shí)現(xiàn)“搖一搖”與“掃一掃”功能示例代碼
“搖一搖”功能的實(shí)現(xiàn):
iPhone對(duì) “搖一搖”有很好的支持,總體說(shuō)來(lái)就兩步:
在視圖控制器中打開(kāi)接受“搖一搖”的開(kāi)關(guān);
- (void)viewDidLoad { // 設(shè)置允許搖一搖功能 [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES; // 并讓自己成為第一響應(yīng)者 [self becomeFirstResponder]; }
在“搖一搖”觸發(fā)的制定的方法中實(shí)現(xiàn)需要實(shí)現(xiàn)的功能(”搖一搖“檢測(cè)方法)。
// 搖一搖開(kāi)始搖動(dòng) - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { NSLog(@"開(kāi)始搖動(dòng)"); //添加“搖一搖”動(dòng)畫(huà) [self addAnimations]; //音效 AudioServicesPlaySystemSound (soundID); return; } // “搖一搖”取消搖動(dòng) - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { NSLog(@"取消搖動(dòng)"); return; } // “搖一搖”搖動(dòng)結(jié)束 - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionShake) { // 判斷是否是搖動(dòng)結(jié)束 NSLog(@"搖動(dòng)結(jié)束"); } return; }
”搖一搖“的動(dòng)畫(huà)效果:
- (void)addAnimations { //音效 AudioServicesPlaySystemSound (soundID); //讓上面圖片的上下移動(dòng) CABasicAnimation *translation2 = [CABasicAnimation animationWithKeyPath:@"position"]; translation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; translation2.fromValue = [NSValue valueWithCGPoint:CGPointMake(160, 115)]; translation2.toValue = [NSValue valueWithCGPoint:CGPointMake(160, 40)]; translation2.duration = 0.4; translation2.repeatCount = 1; translation2.autoreverses = YES; //讓下面的圖片上下移動(dòng) CABasicAnimation *translation = [CABasicAnimation animationWithKeyPath:@"position"]; translation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; translation.fromValue = [NSValue valueWithCGPoint:CGPointMake(160, 345)]; translation.toValue = [NSValue valueWithCGPoint:CGPointMake(160, 420)]; translation.duration = 0.4; translation.repeatCount = 1; translation.autoreverses = YES; [imgDown.layer addAnimation:translation forKey:@"translation"]; [imgUp.layer addAnimation:translation2 forKey:@"translation2"]; }
注意:在模擬器中運(yùn)行時(shí),可以通過(guò)「Hardware」-「Shake Gesture」來(lái)測(cè)試「搖一搖」功能。如下:
“掃一掃”功能的實(shí)現(xiàn):
基于AVCaptureDevice做的二維碼掃描器,基本步驟如下:
初始化相機(jī),生成掃描器
設(shè)置參數(shù)
- (void)setupCamera { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:nil]; _output = [[AVCaptureMetadataOutput alloc]init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; _session = [[AVCaptureSession alloc]init]; [_session setSessionPreset:AVCaptureSessionPresetHigh]; if ([_session canAddInput:self.input]) { [_session addInput:self.input]; } if ([_session canAddOutput:self.output]) { [_session addOutput:self.output]; } // 條碼類型 AVMetadataObjectTypeQRCode _output.metadataObjectTypes = [NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode, nil]; dispatch_async(dispatch_get_main_queue(), ^{ //更新界面 _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session]; _preview.videoGravity = AVLayerVideoGravityResizeAspectFill; _preview.frame = CGRectMake(0, 0, CGRectGetWidth(self.centerView.frame), CGRectGetHeight(self.centerView.frame)); [self.centerView.layer insertSublayer:self.preview atIndex:0]; [_session startRunning]; }); }); }
在viewWillAppear和viewWillDisappear里對(duì)session做優(yōu)化(timer是個(gè)掃描動(dòng)畫(huà)的計(jì)時(shí)器)
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (_session && ![_session isRunning]) { [_session startRunning]; } timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(scanningAnimation) userInfo:nil repeats:YES]; [self setupCamera]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; _count = 0; [timer invalidate]; [self stopReading]; }
處理掃描結(jié)果
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { NSString *stringValue; if ([metadataObjects count] >0){ AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0]; stringValue = metadataObject.stringValue; NSLog(@"%@",stringValue); } [_session stopRunning]; [timer invalidate]; _count ++ ; [self stopReading]; if (stringValue && _count == 1) { //掃描完成 } }
用二維碼掃描器掃描自己的二維碼:
NSString *url = [NSURL URLWithString:@"html/judgement.html" relativeToURL:[ZXApiClient sharedClient].baseURL].absoluteString; if ([stringValue hasPrefix:url]) { //如果掃出來(lái)的url是自己的域名開(kāi)頭的,那么做如下的處理 }
最后附上自己完整的源碼:
// Created by Ydw on 16/3/15. // Copyright © 2016年 IZHUO.NET. All rights reserved. // import “ViewController.h” import <AVFoundation/AVFoundation.h> @interface ViewController () { int number; NSTimer *timer; NSInteger _count; BOOL upOrdown; AVCaptureDevice *lightDevice; } @property (nonatomic,strong) UIView *centerView;//掃描的顯示視圖 /** * 二維碼掃描參數(shù) */ @property (strong,nonatomic) AVCaptureDevice *device; @property (strong,nonatomic) AVCaptureDeviceInput *input; @property (strong,nonatomic) AVCaptureMetadataOutput *output; @property (strong,nonatomic) AVCaptureSession *session; @property (strong,nonatomic) AVCaptureVideoPreviewLayer *preview; @property (nonatomic,retain) UIImageView *imageView;//掃描線 (void)setupCamera; (void)stopReading; @end @implementation ViewController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (_session && ![_session isRunning]) { [_session startRunning]; } timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(scanningAnimation) userInfo:nil repeats:YES]; [self setupCamera]; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor clearColor]; self.automaticallyAdjustsScrollViewInsets = NO; _count = 0 ; //初始化閃光燈設(shè)備 lightDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //掃描范圍 _centerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame))]; _centerView.backgroundColor = [UIColor clearColor]; [self.view addSubview:_centerView]; //掃描的視圖加載 UIView *scanningViewOne = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 120)]; scanningViewOne.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4]; [self.centerView addSubview:scanningViewOne]; UIView *scanningViewTwo = [[UIView alloc]initWithFrame:CGRectMake(0, 120, (self.view.frame.size.width-300)/2, 300)]; scanningViewTwo.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4]; [self.centerView addSubview:scanningViewTwo]; UIView *scanningViewThree = [[UIView alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2+150, 120, (self.view.frame.size.width-300)/2, 300)]; scanningViewThree.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4]; [self.centerView addSubview:scanningViewThree]; UIView *scanningViewFour = [[UIView alloc]initWithFrame:CGRectMake(0, 420, self.view.frame.size.width,CGRectGetHeight(self.view.frame)- 420)]; scanningViewFour.backgroundColor= [[UIColor blackColor] colorWithAlphaComponent:0.4]; [self.centerView addSubview:scanningViewFour]; UILabel *labIntroudction= [[UILabel alloc] initWithFrame:CGRectMake(15, 430, self.view.frame.size.width - 30, 30)]; labIntroudction.backgroundColor = [UIColor clearColor]; labIntroudction.textAlignment = NSTextAlignmentCenter; labIntroudction.textColor = [UIColor whiteColor]; labIntroudction.text = @"請(qǐng)將企業(yè)邀請(qǐng)碼放入掃描框內(nèi)"; [self.centerView addSubview:labIntroudction]; UIButton *openLight = [[UIButton alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2-25, 470, 50, 50)]; [openLight setImage:[UIImage imageNamed:@"燈泡"] forState:UIControlStateNormal]; [openLight setImage:[UIImage imageNamed:@"燈泡2"] forState:UIControlStateSelected]; [openLight addTarget:self action:@selector(openLightWay:) forControlEvents:UIControlEventTouchUpInside]; [self.centerView addSubview:openLight]; //掃描線 _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)/2-110, 130, 220, 5)]; _imageView.image = [UIImage imageNamed:@"scanning@3x"]; [self.centerView addSubview:_imageView]; } - (void)viewWillDisappear:(BOOL)animated { _count= 0; [timer invalidate]; [self stopReading]; } pragma mark -- 設(shè)置參數(shù) - (void)setupCamera { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:nil]; _output = [[AVCaptureMetadataOutput alloc]init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; _session = [[AVCaptureSession alloc]init]; [_session setSessionPreset:AVCaptureSessionPresetHigh]; if ([_session canAddInput:self.input]) { [_session addInput:self.input]; } if ([_session canAddOutput:self.output]) { [_session addOutput:self.output]; } // 條碼類型 AVMetadataObjectTypeQRCode _output.metadataObjectTypes = [NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode, nil]; dispatch_async(dispatch_get_main_queue(), ^{ //更新界面 _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session]; _preview.videoGravity = AVLayerVideoGravityResizeAspectFill; _preview.frame = CGRectMake(0, 0, CGRectGetWidth(self.centerView.frame), CGRectGetHeight(self.centerView.frame)); [self.centerView.layer insertSublayer:self.preview atIndex:0]; [_session startRunning]; }); }); } //掃描動(dòng)畫(huà) - (void)scanningAnimation { if (upOrdown == NO) { number ++; _imageView.frame = CGRectMake(CGRectGetWidth(self.view.frame)/2-115, 130+2*number, 230, 5); if (2*number == 280) { upOrdown = YES; } } else { number --; _imageView.frame = CGRectMake(CGRectGetWidth(self.view.frame)/2-115, 130+2*number, 230, 5); if (number == 0) { upOrdown = NO; } } } - (void)stopReading { [_session stopRunning]; _session = nil; [_preview removeFromSuperlayer]; [timer invalidate]; timer = nil ; } -(void)openLightWay:(UIButton *)sender { if (![lightDevice hasTorch]) {//判斷是否有閃光燈 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"當(dāng)前設(shè)備沒(méi)有閃光燈,不能提供手電筒功能" message:nil preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:nil]; [alert addAction:sureAction]; [self presentViewController:alert animated:YES completion:nil]; return; } sender.selected = !sender.selected; if (sender.selected == YES) { [lightDevice lockForConfiguration:nil]; [lightDevice setTorchMode:AVCaptureTorchModeOn]; [lightDevice unlockForConfiguration]; } else { [lightDevice lockForConfiguration:nil]; [lightDevice setTorchMode: AVCaptureTorchModeOff]; [lightDevice unlockForConfiguration]; } } pragma mark -- AVCaptureMetadataOutputObjectsDelegate - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { NSString *stringValue; if ([metadataObjects count] >0){ AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0]; stringValue = metadataObject.stringValue; NSLog(@"%@",stringValue); } [_session stopRunning]; [timer invalidate]; _count ++ ; [self stopReading]; if (stringValue && _count == 1) { //掃描完成 } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS10 適配-Xcode8問(wèn)題總結(jié)及解決方案
這篇文章主要介紹了iOS10 適配-Xcode8問(wèn)題總結(jié)的相關(guān)資料,這里整理了遇到的幾種問(wèn)題,并給出解決方案,需要的朋友可以參考下2016-11-11iOS 基于AFNetworking下自簽名證書(shū)配置的方法
本篇文章主要介紹了iOS 基于AFNetworking下自簽名證書(shū)配置的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03IOS實(shí)現(xiàn)視頻動(dòng)畫(huà)效果的啟動(dòng)圖
這篇文章實(shí)現(xiàn)的是一個(gè)關(guān)于啟動(dòng)頁(yè)或者引導(dǎo)頁(yè)的視頻動(dòng)畫(huà)效果的實(shí)現(xiàn)過(guò)程,對(duì)于大家開(kāi)發(fā)APP具有一定的參考借鑒價(jià)值,有需要的可以來(lái)看看。2016-09-09iOS中的音頻服務(wù)和音頻AVAudioPlayer音頻播放器使用指南
這里我們要介紹的是AVAudio ToolBox框架中的AudioServicesPlaySystemSound函數(shù)創(chuàng)建的服務(wù),特別適合用來(lái)制作鈴聲,下面就簡(jiǎn)單整理一下iOS中的音頻服務(wù)和音頻AVAudioPlayer音頻播放器使用指南:2016-06-06iOS 檢測(cè)網(wǎng)絡(luò)狀態(tài)的兩種方法
一般有Reachability和AFNetworking監(jiān)測(cè)兩種方式,都是第三方的框架,下文逐一詳細(xì)給大家講解,感興趣的朋友一起看看吧2016-10-10