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

首頁 > 系統(tǒng) > iOS > 正文

iOS實(shí)現(xiàn)“搖一搖”與“掃一掃”功能示例代碼

2020-07-26 02:59:22
字體:
供稿:網(wǎng)友

“搖一搖”功能的實(shí)現(xiàn):

iPhone對(duì) “搖一搖”有很好的支持,總體說來就兩步:

在視圖控制器中打開接受“搖一搖”的開關(guān);

 - (void)viewDidLoad {  // 設(shè)置允許搖一搖功能  [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;  // 并讓自己成為第一響應(yīng)者  [self becomeFirstResponder];}

在“搖一搖”觸發(fā)的制定的方法中實(shí)現(xiàn)需要實(shí)現(xiàn)的功能(”搖一搖“檢測方法)。

// 搖一搖開始搖動(dòng) - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {   NSLog(@"開始搖動(dòng)");  //添加“搖一搖”動(dòng)畫  [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)畫效果:

- (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í),可以通過「Hardware」-「Shake Gesture」來測試「搖一搖」功能。如下:

“掃一掃”功能的實(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)畫的計(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]) {    //如果掃出來的url是自己的域名開頭的,那么做如下的處理  }

最后附上自己完整的源碼:

// 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 = @"請將企業(yè)邀請碼放入掃描框內(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)畫- (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è)備沒有閃光燈,不能提供手電筒功能" 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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 金沙县| 临朐县| 永兴县| 师宗县| 贵阳市| 东乡县| 高雄县| 加查县| 南江县| 洪泽县| 靖远县| 武平县| 嫩江县| 宜兰市| 靖西县| 河间市| 承德县| 杂多县| 姜堰市| 巩义市| 十堰市| 邓州市| 虞城县| 芦溪县| 芮城县| 莫力| 乌鲁木齐市| 隆尧县| 宽甸| 光泽县| 河源市| 宿州市| 南涧| 叙永县| 唐海县| 贵溪市| 温州市| 绩溪县| 龙井市| 乌拉特后旗| 玛沁县|