iOS自帶二維碼掃描

  • 今天項目需要做一個二維碼掃描涕蜂,雖然有很多二維碼掃描的第三方可以用馒稍,但是考慮到項目中的需要皿哨,所以我放棄了使用三方庫,而采用了蘋果原生的掃描纽谒。
  • 原生的二維碼掃描有一個坑证膨,那就是掃描范圍的確定。只要記得掃描范圍是X與Y互換位置佛舱,W與H互換位置椎例,就沒有什么問題了挨决。
  • 下面進入正題:
    1.因為使用原生二維碼掃描请祖,所以需要加入頭文件添加delegate
#import <AVFoundation/AVFoundation.h>
<AVCaptureMetadataOutputObjectsDelegate>

2.接著是使用到的類

@property (strong,nonatomic)AVCaptureDevice * device;
@property (strong,nonatomic)AVCaptureDeviceInput * input;
@property (strong,nonatomic)AVCaptureMetadataOutput * output;
@property (strong,nonatomic)AVCaptureSession * session;
@property (weak, nonatomic) IBOutlet UIView *outputView;//xib中掃描的View
@property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview;
@property (strong, nonatomic) NSTimer * timer;//為了做掃描動畫的定時器
@property (strong, nonatomic) UIImageView * lineImage;//掃描動畫的橫線

3.懶加載一個掃描動畫的圖片

-(UIImageView *)lineImage{
    if (!_lineImage) {
        CGFloat outputW = self.outputView.frame.size.width;
        _lineImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0,outputW, 2)];
        _lineImage.image = [UIImage imageNamed:@"ray"];
    }
    return _lineImage;
}

4.使用前的設(shè)置,我將它設(shè)置在了viewDidLoad當中

-viewDidLoad{
[super viewDidLoad];
   // Device
    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

   // Input
    _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
    
    // Output
    _output = [[AVCaptureMetadataOutput alloc]init];
    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
    // Session
    _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];
    }
//設(shè)置條碼類型
    _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];
    
    //設(shè)置條碼位置
    CGFloat X = (ScreenW/2-100)/ScreenW;
    CGFloat Y = (ScreenH/2-100)/ScreenH;
    CGFloat W = 200/ScreenW;
    CGFloat H = 200/ScreenH;
    //設(shè)置掃描范圍(注意脖祈,X與Y交互肆捕,W與H交換)
    [_output setRectOfInterest:CGRectMake(Y, X, H, W)];
//添加掃描畫面
    _preview =[AVCaptureVideoPreviewLayer layerWithSession:_session];
    _preview.videoGravity =AVLayerVideoGravityResizeAspectFill;
    _preview.frame = CGRectMake(0, 0, ScreenW, ScreenH);//self.view.layer.bounds;
    [self.view.layer insertSublayer:_preview atIndex:0];
    //開始掃描
    [_session startRunning];

 //添加掃描動畫定時器
[self.outputView addSubview:self.lineImage];
    // Do any additional setup after loading the view from its nib.
    _timer = [NSTimer scheduledTimerWithTimeInterval:2.5f
                                              target:self
                                            selector:@selector(lineAction)
                                            userInfo:nil
                                             repeats:YES];
}

5.二維碼掃描的代理事件

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    NSString *stringValue;
    if ([metadataObjects count] >0){
        //停止掃描
        [_session stopRunning];
       AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
       stringValue = metadataObject.stringValue;//stringValue是掃描拿到的內(nèi)容,更具內(nèi)容進行后續(xù)工作盖高。
    }
}

6.添加掃描動畫的事件

 - (void)lineAction{
    CGFloat outputW = self.outputView.frame.size.width;
    CGFloat outputH = self.outputView.frame.size.height;
    [UIView animateWithDuration:2.4f animations:^{
        CGRect frame = CGRectMake(0, outputH, outputW, 2);
        self.lineImage.frame = frame;
    } completion:^(BOOL finished) {
        CGRect frame = CGRectMake(0, 0, outputW, 2);
        self.lineImage.frame = frame;
    }];
}

7.該變掃描視屏方向

_preview.connection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation];
-(AVCaptureVideoOrientation) videoOrientationFromCurrentDeviceOrientation {
    switch (self.interfaceOrientation) {
        case UIInterfaceOrientationPortrait: {
            return AVCaptureVideoOrientationPortrait;
        }
        case UIInterfaceOrientationLandscapeLeft: {
            return AVCaptureVideoOrientationLandscapeLeft;
        }
        case UIInterfaceOrientationLandscapeRight: {
            return AVCaptureVideoOrientationLandscapeRight;
        }
        case UIInterfaceOrientationPortraitUpsideDown: {
            return AVCaptureVideoOrientationPortraitUpsideDown;
        }
        default:return AVCaptureVideoOrientationPortrait;
    }
}
  • 搞定......
  • 最后放上一張效果圖
原生的掃描就是快慎陵,??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喻奥,隨后出現(xiàn)的幾起案子席纽,更是在濱河造成了極大的恐慌,老刑警劉巖撞蚕,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润梯,死亡現(xiàn)場離奇詭異,居然都是意外死亡甥厦,警方通過查閱死者的電腦和手機纺铭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刀疙,“玉大人舶赔,你說我怎么就攤上這事∏恚” “怎么了竟纳?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵撵溃,是天一觀的道長。 經(jīng)常有香客問我锥累,道長征懈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任揩悄,我火速辦了婚禮卖哎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘删性。我一直安慰自己亏娜,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布蹬挺。 她就那樣靜靜地躺著维贺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巴帮。 梳的紋絲不亂的頭發(fā)上溯泣,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音榕茧,去河邊找鬼垃沦。 笑死,一個胖子當著我的面吹牛用押,可吹牛的內(nèi)容都是我干的肢簿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蜻拨,長吁一口氣:“原來是場噩夢啊……” “哼池充!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缎讼,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤收夸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后血崭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卧惜,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年功氨,在試婚紗的時候發(fā)現(xiàn)自己被綠了序苏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡捷凄,死狀恐怖忱详,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跺涤,我是刑警寧澤匈睁,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布监透,位于F島的核電站,受9級特大地震影響航唆,放射性物質(zhì)發(fā)生泄漏胀蛮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一糯钙、第九天 我趴在偏房一處隱蔽的房頂上張望粪狼。 院中可真熱鬧,春花似錦任岸、人聲如沸再榄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽困鸥。三九已至,卻和暖如春剑按,著一層夾襖步出監(jiān)牢的瞬間疾就,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工艺蝴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猬腰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓吴趴,卻偏偏與公主長得像漆诽,于是被迫代替她去往敵國和親侮攀。 傳聞我的和親對象是個殘疾皇子锣枝,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 分享的內(nèi)容,大家看了后,不管有什么問題或者建議,都可以說出來,我都會一一做答,一起加油啦 我的下一篇 < >需要的...
    邵瓊閱讀 824評論 0 0
  • #import "BaseViewController.h" @interface ScanCodeVC : Ba...
    這樣的我321閱讀 561評論 0 2
  • VLC的集成和使用 VLC介紹 VLC Media Player (VideoLAN) 為 Windows、Lin...
    Pocket閱讀 19,556評論 75 66
  • 自用-二維碼掃描模塊代碼 效果圖 直接上代碼 注釋寫的還算詳細-需要準備下面的東西,其中preView是要顯示的樣...
  • 晚上帶女兒在創(chuàng)業(yè)廣場玩兰英,遇到晨撇叁,她逗著我女兒玩了一會兒,對我說:葉樓也結(jié)婚了畦贸,孩子比你的大不了二歲陨闹。 葉樓?已經(jīng)十...
    張玉曼閱讀 519評論 0 1