2016-01-05 9 views
7

के लिए रोटेशन अक्षम करें मेरे पास UITabBarController है जिसमें 4 आइटम टैब हैं। उनमें से एक AvCaptureVideoPreviewLayer है (एक बारकोड स्कैनर है)। मैं क्या करना चाहता हूं केवल AVCaptureVideoPreviewLayer (आईओएस कैमरा ऐप की तरह) के लिए ऑटोरोटेट को अक्षम करना है, लेकिन 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 अगर यह autorotate चाहिए परिभाषित करेगा।

2 - अब जब कि UITabBarController अपने ViewControllers पूछना होगा अगर यह autorotate चाहिए, तो आप के रूप में अच्छी हर नियंत्रक में shouldAutorotate ओवरराइड करने के लिए किया है।

और यही वह है!

क्षमा करें अगर मैंने आपके प्रश्न को गलत समझा। यदि आप अधिक जानकारी प्रदान करते हैं तो इससे मदद मिलेगी।

देखभाल करें :)

+1

अच्छा! यह मेरी मदद की –

संबंधित मुद्दे