iOS,Swift-掃描二維碼/條形碼

就幾段代碼就實現了,干嘛去用啥子三方啊
籌字數 把oc炼邀,swift一起寫上了魄揉,要加什么動畫效果再添加,拭宁,記到還有獲取相機權限的操作處理

oc

#import "ScanViewController.h"
#import <AVFoundation/AVFoundation.h>
#import<AVFoundation/AVCaptureDevice.h>
#import<AVFoundation/AVMediaFormat.h>

@interface ScanViewController () <AVCaptureMetadataOutputObjectsDelegate>
@property (nonatomic ,strong) AVCaptureSession *captureSession;
@property (nonatomic ,strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@end

@implementation ScanViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //獲取攝像設備
    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //創(chuàng)建輸入流
    AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    //創(chuàng)建輸出流
    AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];

    //設置代理 在主線程里刷新
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    //設置識別區(qū)域
    output.rectOfInterest = [self calculateScanRect];

    //初始化鏈接對象
    self.captureSession = [[AVCaptureSession alloc]init];
    //高質量采集率
    [self.captureSession setSessionPreset:AVCaptureSessionPresetHigh];

    [self.captureSession addInput:input];
    [self.captureSession addOutput:output];

    //設置掃碼支持的編碼格式(如下設置條形碼和二維碼兼容)
    output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode93Code];

    self.videoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
    self.videoPreviewLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;
    self.videoPreviewLayer.frame=CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);

    [self.view.layer insertSublayer:self.videoPreviewLayer atIndex:0];

   //開始捕獲
   [self.captureSession startRunning];
 }

-(CGRect)calculateScanRect {
    CGSize previewSize = self.videoPreviewLayer.frame.size;
    CGSize scanSize  = CGSizeMake(previewSize.width * 3/4, previewSize.height * 3/4);
    CGRect scanRect = CGRectMake((previewSize.width-scanSize.width)/2,
                             (previewSize.height-scanSize.height)/2, scanSize.width, scanSize.height);
    scanRect = CGRectMake(scanRect.origin.y/previewSize.height,
                      scanRect.origin.x/previewSize.width,
                      scanRect.size.height/previewSize.height,
                      scanRect.size.width/previewSize.width);
    return scanRect;
}

#pragma mark - AVCaptureMetadataOutputObjectsDelegate

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if (metadataObjects.count>0) {
        [self.captureSession stopRunning];//停止掃描
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : 0 ];
        //輸出掃描字符串
        NSLog(@"%@",metadataObject.stringValue);
    }
}

@end

然后是swift

/**
 顯示掃描視圖
 */
private func showScanCode() {
    if self.captureSession == nil {
        let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        var input: AnyObject!
        do {
            input = try AVCaptureDeviceInput(device: captureDevice)
        }
        catch {
            return
        }
        self.captureSession = AVCaptureSession()
        self.captureSession?.addInput(input as! AVCaptureInput)
        let captureMetadataOutput = AVCaptureMetadataOutput()
        self.captureSession?.addOutput(captureMetadataOutput)
        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        captureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code,
                                                     AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,
                                                     AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode93Code]
        self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
        self.videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        self.videoPreviewLayer?.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
        captureMetadataOutput.rectOfInterest = self.calculateScanRect()
        self.view.layer.addSublayer(self.videoPreviewLayer!)
        // 放大
        do {
            try captureDevice!.lockForConfiguration()
        } catch {
            return
        }
        let maxZoomFactor = captureDevice!.activeFormat.videoMaxZoomFactor
        let zoomFactor = maxZoomFactor < 2.0 ? maxZoomFactor : 2.0
        captureDevice!.videoZoomFactor = zoomFactor
        captureDevice!.unlockForConfiguration()
    }
    self.captureSession?.startRunning()
}

private func calculateScanRect() -> CGRect {
    let previewSize: CGSize = self.videoPreviewLayer!.frame.size
    let scanSize: CGSize = CGSizeMake(previewSize.width * 3/4, previewSize.height * 3/4)
    var scanRect:CGRect = CGRectMake((previewSize.width-scanSize.width)/2,
                                     (previewSize.height-scanSize.height)/2, scanSize.width, scanSize.height);
    // AVCapture輸出的圖片大小都是橫著的洛退,而iPhone的屏幕是豎著的,那么我把它旋轉90°
    scanRect = CGRectMake(scanRect.origin.y/previewSize.height,
                          scanRect.origin.x/previewSize.width,
                          scanRect.size.height/previewSize.height,
                          scanRect.size.width/previewSize.width);
    return scanRect
}

// MARK: - AVCaptureMetadataOutputObjectsDelegate

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    if let metadatas = metadataObjects {
        if metadatas.count > 0 {
            let metadata = metadatas[0] as? AVMetadataMachineReadableCodeObject
            if let barCode = metadata?.stringValue {
                print("barCode: \(barCode)")
            }
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末杰标,一起剝皮案震驚了整個濱河市兵怯,隨后出現的幾起案子,更是在濱河造成了極大的恐慌腔剂,老刑警劉巖媒区,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡驻仅,警方通過查閱死者的電腦和手機谅畅,發(fā)現死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪服,“玉大人毡泻,你說我怎么就攤上這事≌秤牛” “怎么了仇味?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雹顺。 經常有香客問我丹墨,道長,這世上最難降的妖魔是什么嬉愧? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任贩挣,我火速辦了婚禮,結果婚禮上没酣,老公的妹妹穿的比我還像新娘王财。我一直安慰自己,他們只是感情好裕便,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布绒净。 她就那樣靜靜地躺著,像睡著了一般偿衰。 火紅的嫁衣襯著肌膚如雪挂疆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天下翎,我揣著相機與錄音缤言,去河邊找鬼。 笑死视事,一個胖子當著我的面吹牛胆萧,可吹牛的內容都是我干的。 我是一名探鬼主播郑口,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸳碧,長吁一口氣:“原來是場噩夢啊……” “哼盾鳞!你這毒婦竟也來了犬性?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腾仅,失蹤者是張志新(化名)和其女友劉穎乒裆,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體推励,經...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鹤耍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年肉迫,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿黄。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡喊衫,死狀恐怖,靈堂內的尸體忽然破棺而出杆怕,到底是詐尸還是另有隱情族购,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布陵珍,位于F島的核電站寝杖,受9級特大地震影響,放射性物質發(fā)生泄漏互纯。R本人自食惡果不足惜瑟幕,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望留潦。 院中可真熱鬧只盹,春花似錦、人聲如沸愤兵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秆乳。三九已至懦鼠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屹堰,已是汗流浹背肛冶。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扯键,地道東北人睦袖。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像荣刑,于是被迫代替她去往敵國和親馅笙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容

  • 發(fā)現 關注 消息 iOS 第三方庫厉亏、插件董习、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 我種的樹,開一花窝趣,結一果 鷦鷯在森林里筑巢 只能占居其中的一棵 偃鼠到黃河里喝水 只能灌滿自己的肚子 諸發(fā)手執(zhí)一枝...
    黑咖啡_鐘閱讀 456評論 0 1
  • 第一部分 「引」 「神龕」哑舒,是供奉神像或神主的小閣子妇拯。 今天這篇文章是關于陰陽師的。 關注《陰陽師》手游的人洗鸵,可能...
    小郭hhhh閱讀 748評論 9 6
  • 也許 我應該在這條路上做些什么 但是我缺少了好多東西 我的腳 陷入了惡魔血液流聚成的血海里 我的腰 被他錚錚魔爪深...
    簡白安閱讀 267評論 0 1
  • 時間真是一把殺豬刀预麸,我已不是我瞪浸,可你還是你。 其實和你在一起吏祸,大家都是不看好的对蒲。他們都覺得你不夠愛我...
    Sylvan閱讀 344評論 0 1