蘋果原生二維碼掃描功能——可限制掃描地區

來源:互聯網
上載者:User

標籤:

使用原生的好處就是掃描特別快效率特別高,使用  AVFoundation 來進行二維碼掃描,更主要的是限制掃描二維碼的範圍。(預設的是全屏掃描)

首先是要用到的幾個類

@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;

 

下面分別建立他們

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

}

// 條碼類型 AVMetadataObjectTypeQRCode

_output . metadataObjectTypes = @[ AVMetadataObjectTypeQRCode ] ;

// Preview

_preview =[ AVCaptureVideoPreviewLayer layerWithSession : _session ];

_preview . videoGravity = AVLayerVideoGravityResizeAspectFill ;

_preview . frame = self . view . layer . bounds ;

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

// Start

[ _session startRunning ];

然後實現 AVCaptureMetadataOutputObjectsDelegate

#pragma mark AVCaptureMetadataOutputObjectsDelegate

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

}

}

到此為止就可以成功掃描二維碼了,但是有個尷尬的問題,這時的掃描是全屏掃描的。

 

 

一般情況下項目中的掃描頁面是這樣的,但是當你掃描的時候會發現在二維碼還沒進入中心的那個小方塊時,就已經成功掃描完成了,這對於體驗來說很不好。但是由於那時候趕項目就沒有時間最佳化。終於今天抽出來時間了。

我從早上上班開始一直搞到下午,把所有想到的方法都試了一遍,但是都不行(都是淚),最後將要放棄的時候發現了一個比較可疑的點。

@property ( nonatomic ) CGRect rectOfInterest NS_AVAILABLE_IOS ( 7 _0);

這是的  AVCaptureMetadataOutput 一個屬性,它的解釋是

@discussion

The value of this property is a CGRect that determines the receiver‘s rectangle of interest for each frame of video.  

The rectangle‘s origin is top left and is relative to the coordinate space of the device providing the metadata.  Specifying 

a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the 

value CGRectMake(0, 0, 1, 1).  Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.

大概意思就是設定每一幀畫面感興趣的地區(字面意思),那豈不是就是設定掃描範圍嘍,大喜

於是趕緊把 rectOfInterest 設定成中間框的frame,

[ _output setRectOfInterest : CGRectMake (( ScreenWidth - 220 )/ 2 , 60 + 64 , 220 , 220 )];

//中間地區的寬和高都是220   ScreenWidth為裝置螢幕寬度

但是卻發現怎麼掃描都不能成功了。於是又看了看上面的一段話。

第二句:地區的原點在左上方(後面才知道坑苦我了!),然後地區是相對於裝置的大小的,預設值是 CGRectMake(0, 0, 1, 1) ,這時候我才知道是有比例關係的,最大值才是1,也就是說只要除以相應的裝置寬和高的大小不就行了?然後就改成

[ _output setRectOfInterest : CGRectMake ((( ScreenWidth - 220 )/ 2 )/ ScreenWidth ,( 60 + 64 )/ ScreenHigh , 220 / ScreenWidth , 220 / ScreenHigh )];

按說這樣應該就完美了,但是才知道我還是高興得太早了,一掃描才發現完全不是那麼回事,差很多。

於是我就一點一點調,但是最後也沒調成功,最後一狠心有設定了一個很確定的值。

[ _output   setRectOfInterest : CGRectMake ( 0.5 , 0.5 , 0.5 ,  0.5 )];

這次應該很確定是在右下方的四分之一地區吧,嘿嘿。

但是事實又一次打擊了我,掃描後發現是左下的四分之一地區,也就是說 rectOfInterest的原點是右上方!!!

回頭又一想,即使右上方是原點那也應該沒有影響啊,但是為什麼不行呢,不會是原點的 X 和 Y 互換了吧?算了不管怎麼著,試一試吧。

[ _output setRectOfInterest : CGRectMake (( 60 + 64 )/ ScreenHigh ,(( ScreenWidth - 220 )/ 2 )/ ScreenWidth , 220 / ScreenWidth , 220 / ScreenHigh )];

又掃描了一下發現成功了!果然原點正確了,我只想說TMD!

但是寬和高又怎麼對不上了?不會也互換了吧!趕緊試試

[ _output setRectOfInterest : CGRectMake (( 124 )/ ScreenHigh ,(( ScreenWidth - 220 )/ 2 )/ ScreenWidth , 220 / ScreenHigh , 220 / ScreenWidth )];

 

轉載http://www.th7.cn/program/ios/201411/323619.shtml

蘋果原生二維碼掃描功能——可限制掃描地區

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.