首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

iOS利用AVCaptureSession实现二维码扫描(2)

iOS利用AVCaptureSession实现二维码扫描(2)

4 开始扫描

    #pragma mark 开始
    - (void)startRunning {
       if (self.captureSession) {
           self.isReading = YES;
           [self.captureSession startRunning];
           _timer=[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selectorselector(moveUpAndDownLine) userInfo:nil repeats: YES];
       }
    }

5 扫描线移动

    - (void)moveUpAndDownLine {
        CGRect frame = self.scanLayer.frame;
        if (_boxView.frame.size.height < self.scanLayer.frame.origin.y) {
            frame.origin.y = 0;
            self.scanLayer.frame = frame;
        } else {
            frame.origin.y += 5;
            [UIView animateWithDuration:0.2 animations:^{
                self.scanLayer.frame = frame;
            }];
        }
    }

6 AVCaptureMetadataOutputObjectsDelegate

这个是里面用到的最重要的方法,在这个代理方法里我们可以获得扫描二维码解析出来的数据,然后在里面进行操作

    #pragma mark - AVCaptureMetadataOutputObjectsDelegate
    - (void)captureOutputAVCaptureOutput *)output didOutputMetadataObjectsNSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnectionAVCaptureConnection *)connection {
        //判断是否有数据
        if (!_isReading) {
            return;
        }
        if (metadataObjects.count > 0) {
            _isReading = NO;
            AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects[0];
            NSString *result = metadataObject.stringValue;
            if (self.resultBlock) {
                self.resultBlock(result?"");
            }
            [self.navigationController popViewControllerAnimated:NO];
        }
    }

7 退出时记得关闭

    #pragma mark 结束
    - (void)stopRunning {
        if ([_timer isValid]) {
            [_timer invalidate];
            _timer = nil ;
        }
        [self.captureSession stopRunning];
        [_scanLayer removeFromSuperlayer];
        [_videoPreviewLayer removeFromSuperlayer];
    }
返回列表