之前一直是在手機(jī)上開發(fā),用系統(tǒng)原生二維碼掃描功能,一點(diǎn)問題都沒有,但是在ipad上,用戶是橫屏操作的,雖然界面旋轉(zhuǎn)了,是橫屏的,但是攝像頭里顯示的依然是豎屏效果,也就是說從攝像頭里看到的和人眼看到的內(nèi)容相差90度或者270度,網(wǎng)上搜索了一番,是這個(gè)AVCaptureVideoPreviewLayer 的問題,設(shè)備旋轉(zhuǎn)了,但是它沒有旋轉(zhuǎn),導(dǎo)致屏幕顯示的,和人眼看到的有偏差,找到如下解決辦法,希望對(duì)大家有幫助:
-(void)rotateLayer{ CALayer * stuckview = layer;(創(chuàng)建原生掃描功能時(shí)用到的這個(gè)類:AVCaptureVideoPreviewLayer 的對(duì)象 ) CGRect layerRect = self.view.layer.bounds; //獲取當(dāng)前設(shè)備的旋轉(zhuǎn)角度 UIDeviceOrientation orientation =[[UIDevice currentDevice]orientation];
switch (orientation) {case UIDeviceOrientationLandscapeLeft:? ? ? ? stuckview.affineTransform = CGAffineTransformMakeRotation(M_PI+ M_PI_2);// 270 degrees? ? ? //旋轉(zhuǎn)270度和90度的效果是一樣的,設(shè)備旋轉(zhuǎn)之后,屏幕寬和高對(duì)換了,那么攝像頭的layer的寬高也應(yīng)該對(duì)換? ? ? ? [stuckview setBounds:CGRectMake(0,0, layerRect.size.height, layerRect.size.width)];break;case UIDeviceOrientationLandscapeRight:? ? ? ? stuckview.affineTransform = CGAffineTransformMakeRotation(M_PI_2);// 90 degrees? ? ? ? [stuckview setBounds:CGRectMake(0,0, layerRect.size.height, layerRect.size.width)];break;case UIDeviceOrientationPortraitUpsideDown:? ? ? ? stuckview.affineTransform = CGAffineTransformMakeRotation(M_PI);// 180 degrees
//設(shè)備正著和倒著都是豎屏,寬高沒變化,那么攝像頭的layer的寬高也還是屏幕的寬高 [stuckview setBounds:layerRect]; break; default: stuckview.affineTransform = CGAffineTransformMakeRotation(0.0); [stuckview setBounds:layerRect]; break; } [stuckview setPosition:CGPointMake(CGRectGetMidX(layerRect),CGRectGetMidY(layerRect))]; }