2017-04-27 15 views
8

मेरे पास AVCaptureVideoPreviewLayer उदाहरण दृश्य नियंत्रक दृश्य पदानुक्रम में जोड़ा गया है।AVCaptureVideoPreviewLayer गलत अभिविन्यास जब UI रोटेशन अक्षम किया गया है

- (void) loadView { 
    ... 

    self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:nil]; 
    self.previewLayer.frame = self.view.bounds; 
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

    [self.view.layer addSublayer: _previewLayer]; 

    // adding other UI elements 
    ... 
} 

... 

- (void) _setupPreviewLayerWithSession: (AVCaptureSession*) captureSession 
{ 
    self.previewLayer.session = self.captureManager.captureSession; 
    self.previewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight; 
} 

परत फ्रेम -viewDidLayoutSubviews विधि में अद्यतन किया गया है। देखें नियंत्रक अभिविन्यास UIInterfaceOrientationMaskLandscapeRight पर बंद कर दिया गया है।

समस्या निम्न प्रकार है:

  1. उपकरण को लैंडस्केप अभिविन्यास
  2. दृश्य नियंत्रक रीति से प्रस्तुत किया है में आयोजित किया जाता है - सही ढंग से वीडियो परत को प्रदर्शित करता है। Correct orientation
  3. डिवाइस को तब लॉक कर दिया जाता है और जब यह लॉक होता है तो डिवाइस पोर्ट्रेट अभिविन्यास पर घुमाया जाता है।
  4. डिवाइस को तब अनलॉक किया गया है जबकि अभी भी पोर्ट्रेट अभिविन्यास में है और कई सेकंड के लिए वीडियो परत 90 डिग्री घूर्णन प्रदर्शित होती है। हालांकि, वीडियो परत के लिए फ्रेम सही है। अन्य सभी यूआई तत्व सही ढंग से प्रदर्शित होते हैं। कई सेकंड के बाद परत अभिविन्यास को सही करने के लिए snaps।

    • AVCaptureSessionDidStartRunningNotification और UIApplicationDidBecomeActiveNotification सूचनाएं
    • की सदस्यता: कृपया नीचे Incorrect orientation

मैं (बिना किसी परिणाम के) के बाद के रूप में वीडियो परत उन्मुखीकरण को अद्यतन करने की कोशिश की है परत और UI तत्व के लिए सीमा को खोजने

  • अद्यतन को कॉल करते समय -viewWillTransitionToSize:withTransitionCoordinator: विधि
  • पर -viewWillAppear:
  • यह समस्या वीडियो परत अभिविन्यास से ही जुड़ी प्रतीत नहीं होती है, लेकिन पदानुक्रम लेआउट देखने के लिए अधिक है।

    अद्यतन:

    सुझाव के रूप में, मैं भी डिवाइस अभिविन्यास परिवर्तन जो मदद नहीं की पर वीडियो परत उन्मुखीकरण को अद्यतन करने की कोशिश की।

    मैंने यह भी देखा कि एप्लिकेशन लॉन्च होने के बाद ज्यादातर समस्या होती है और स्क्रीन पहली बार प्रस्तुत की जाती है। उसी सत्र के दौरान बाद में स्क्रीन प्रस्तुतियों पर, इस मुद्दे के लिए पुनरुत्पादन दर वास्तव में कम है (1/20 की तरह कुछ)।

    +1

    रजिस्टर, समारोह fixOrientation जोड़ने() viewWillAppear पर और enterForeground पर यह कहते हैं, विधि में: UIDevice.current.setValue (NSNumber (मूल्य: UIInterfaceOrientation। portrait.rawValue), forKey: "ओरिएंटेशन") यदि आप इसके परिदृश्य लिफ्ट/दाएं हैं, तो मैंने काम करने की आवश्यकता होगी, मैंने ओबीजे-सी के साथ कुछ साल पहले इस कोड का उपयोग किया था, इसलिए टिप्पणी के रूप में लिखना क्योंकि मैंने – SeanLintern88

    उत्तर

    3

    इस कोड का प्रयास करें: enterForeground अधिसूचना के लिए

    [[NSNotificationCenter defaultCenter] addObserver:self 
                  selector:@selector(orientationChanged:) 
                   name:UIDeviceOrientationDidChangeNotification 
                   object:nil]; 
    -(void)orientationChanged:(NSNotification *)notif { 
    
        [_videoPreviewLayer setFrame:_viewPreview.layer.bounds]; 
        if (_videoPreviewLayer.connection.supportsVideoOrientation) { 
         _videoPreviewLayer.connection.videoOrientation = [self interfaceOrientationToVideoOrientation:[UIApplication sharedApplication].statusBarOrientation]; 
        } 
    
    } 
    
    - (AVCaptureVideoOrientation)interfaceOrientationToVideoOrientation:(UIInterfaceOrientation)orientation { 
        switch (orientation) { 
         case UIInterfaceOrientationPortrait: 
          return AVCaptureVideoOrientationPortrait; 
         case UIInterfaceOrientationPortraitUpsideDown: 
          return AVCaptureVideoOrientationPortraitUpsideDown; 
         case UIInterfaceOrientationLandscapeLeft: 
          return AVCaptureVideoOrientationLandscapeLeft; 
         case UIInterfaceOrientationLandscapeRight: 
          return AVCaptureVideoOrientationLandscapeRight; 
         default: 
          break; 
        } 
    // NSLog(@"Warning - Didn't recognise interface orientation (%d)",orientation); 
        return AVCaptureVideoOrientationPortrait; 
    } 
    
    +0

    का परीक्षण नहीं किया है धन्यवाद, मैंने आपके सुझाव को लागू करने का प्रयास किया है और इससे भी मदद नहीं मिली है। अधिक जानकारी के लिए कृपया प्रश्न में अद्यतन अनुभाग देखें। – NikGreen

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