美文网首页ios初级篇
iOS实现“摇一摇”与“扫一扫”功能示例代码

iOS实现“摇一摇”与“扫一扫”功能示例代码

作者: 等不来的期待 | 来源:发表于2017-02-14 21:27 被阅读73次

    本篇文章主要介绍了iOS实现“摇一摇”与“扫一扫”功能示例代码;有需要的朋友可以作为参考下:

    “摇一摇”功能的实现:

    iPhone对 “摇一摇”有很好的支持,总体说来就两步:

    在视图控制器中打开接受“摇一摇”的开关;

    - (void)viewDidLoad {

    // 设置允许摇一摇功能

    [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;

    // 并让自己成为第一响应者

    [self becomeFirstResponder];

    }

    在“摇一摇”触发的制定的方法中实现需要实现的功能(”摇一摇“检测方法)。

    // 摇一摇开始摇动

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {

    NSLog(@"开始摇动");

    //添加“摇一摇”动画

    [self addAnimations];

    //音效

    AudioServicesPlaySystemSound (soundID);

    return;

    }

    // “摇一摇”取消摇动

    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {

    NSLog(@"取消摇动");

    return;

    }

    // “摇一摇”摇动结束

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {

    if (event.subtype == UIEventSubtypeMotionShake) { // 判断是否是摇动结束

    NSLog(@"摇动结束");

    }

    return;

    }

    ”摇一摇“的动画效果:

    - (void)addAnimations {

    //音效

    AudioServicesPlaySystemSound (soundID);

    //让上面图片的上下移动

    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;

    //让下面的图片上下移动

    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"];

    }

    注意:在模拟器中运行时,可以通过「Hardware」-「Shake Gesture」来测试「摇一摇」功能。如下:

    “扫一扫”功能的实现:

    基于AVCaptureDevice做的二维码扫描器,基本步骤如下:

    初始化相机,生成扫描器

    设置参数

    - (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];

    });

    });

    }

    处理扫描结果:

    - (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是自己的域名开头的,那么做如下的处理

    }

    相关文章

      网友评论

      • SHRookie:您好 这个 摇动的次数怎么记录呢

      本文标题:iOS实现“摇一摇”与“扫一扫”功能示例代码

      本文链接:https://www.haomeiwen.com/subject/uwdfwttx.html