2016-01-05 15 views
7

Ho un UITabBarController che ha 4 schede di elementi. Uno di questi è uno AvCaptureVideoPreviewLayer (è uno scanner di codici a barre). Quello che mi piacerebbe fare è disabilitare l'autorotazione solo per AVCaptureVideoPreviewLayer (come l'app per telecamera iOS) ma non per lo item bar che ruotarebbe con lo schermo. È una situazione un po 'difficile perché penso che lo UITabBarConrtoller non ti permetta di disattivare facilmente la rotazione.Disabilita rotazione solo per AVCaptureVideoPreviewLayer

Il codice per la mia telecamera è:

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) { 

} 

} 

risposta

2

Io non sono sicuro al 100% se ho capito bene. Ma che cosa si potrebbe fare è:

1 - sottoclasse tua UITabBarController e sovrascrivere shouldAutorotate con qualcosa di simile:

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

Ciò significa che il UIViewController selezionato sarà definire se deve Rotazione automatica.

2 - Ora che il UITabBarController chiederà suoi ViewControllers se deve AutoRotate, è necessario eseguire l'override shouldAutorotate in ogni controller pure.

E questo è tutto!

Scusa se ho frainteso la tua domanda. Se fornisci ulteriori informazioni sarebbe di aiuto.

Fare attenzione :)

+1

bello! Mi ha aiutato –

Problemi correlati