2016-01-05 56 views
7

我有一個UITabBarController它有4個項目選項卡。其中一個是AvCaptureVideoPreviewLayer(是條形碼掃描儀)。我想要做的只是禁用AVCaptureVideoPreviewLayer(如iOS相機應用程序)的自動旋轉,而不是item bar,它將與屏幕一起旋轉。這是一個有點困難的情況,因爲我認爲UITabBarConrtoller不允許你輕鬆禁用旋轉。禁用僅用於AVCaptureVideoPreviewLayer的旋轉

的代碼爲我的相機的看法是:

import UIKit 
import AVFoundation 

class ScannerViewController: UIViewController, 

// MARK: Properties 

/// Manages the data flow from the capture stage through our input devices. 
var captureSession: AVCaptureSession! 

/// Dispays the data as captured from our input device. 
var previewLayer: AVCaptureVideoPreviewLayer! 


// MARK: Methods 

override func viewDidLoad() { 

    super.viewDidLoad() 

    view.backgroundColor = UIColor.blackColor() 
    self.captureSession = AVCaptureSession() 

    // This object represents a physical capture device and the properties associated with that device 
    let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    // Is useful for capturing the data from the input device 
    let videoInput: AVCaptureDeviceInput 

    do { 
     videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 
    } catch { 
     // TODO: maybe show an alert 
     return 
    } 

    if (self.captureSession.canAddInput(videoInput)) { 
     self.captureSession.addInput(videoInput) 
    } else { 
     failed(); 
     return; 
    } 

    let metadataOutput = AVCaptureMetadataOutput() 

    if (self.captureSession.canAddOutput(metadataOutput)) { 
     self.captureSession.addOutput(metadataOutput) 

     metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) 
     metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code, 
      AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, 
      AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeCode93Code, 
      AVMetadataObjectTypeCode128Code] 
    } else { 
     failed() 
     return 
    } 

    // Adds the preview layer to display the captured data. Sets the videoGravity to AspectFill so that it covers the full screen 
    self.previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession); 
    self.previewLayer.frame = self.view.layer.bounds; 
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    self.view.layer.addSublayer(previewLayer); 
    self.captureSession.startRunning(); 

} 

override func viewDidLayoutSubviews() { 

    self.previewLayer?.frame = self.view.layer.bounds; 

} 

override func didReceiveMemoryWarning() { 

    super.didReceiveMemoryWarning() 

} 

override func viewWillAppear(animated: Bool) { 

    super.viewWillAppear(animated) 

    if (self.captureSession.running == false) { 
     self.captureSession.startRunning(); 
    } 

} 

override func viewWillDisappear(animated: Bool) { 

    super.viewWillDisappear(animated) 

    if (self.captureSession.running == true) { 
     self.captureSession.stopRunning(); 
    } 

} 

func failed() { 

    let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .Alert) 
    ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
    presentViewController(ac, animated: true, completion: nil) 
    self.captureSession = nil 

} 

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { 

    self.captureSession.stopRunning() 

    if let metadataObject = metadataObjects.first { 
     let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject; 

     AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
     foundCode(readableObject.stringValue); 
    } 

} 

/// Completes some tasks when a barcode is found. 
/// 
/// - parameter code: The the barcode found. 
func foundCode(code: String) { 

} 

} 

回答

2

我不是100%肯定,如果我理解正確。但是你可以做的是:

1 -子類的UITabBarController並覆蓋shouldAutorotate像這樣的東西:

override var shouldAutorotate: Bool { 
    guard let viewController = tabBarController?.selectedViewController else { return false } 
    return viewController.shouldAutorotate 
} 

這意味着選擇UIViewController將確定是否應自動旋轉。

2 - 現在UITabBarController將要求其ViewControllers是否應該自動旋轉,你必須覆蓋每個控制器shouldAutorotate爲好。

就是這樣!

對不起,如果我誤解了你的問題。如果您提供更多信息,這將有所幫助。

小心:)

+1

不錯!它幫助了我 –