समर्थित अभिविन्यास में अनुप्रयोग के साथ कोई सामान्य अभिविन्यास नहीं है, और चाहिए


92

मेरा ऐप (आईपैड; आईओएस 6) एक लैंडस्केप केवल एप्लिकेशन है, लेकिन जब मैं फोटो लाइब्रेरी को प्रदर्शित करने के लिए एक यूआईपीओपओवरकंट्रोलर का उपयोग करने की कोशिश करता हूं तो यह इस त्रुटि को फेंकता है: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.मैंने बहुत सारे कोड बदलने की कोशिश की है, लेकिन मेरे पास कोई भाग्य नहीं है।


1
आपको एक उत्तर स्वीकार करना चाहिए। मदद के लिए बहुत से लोग हैं और अन्य लोगों के लिए, जिनके पास एक ही मुद्दा है यह तब मदद करता है जब आप अपने मुद्दे के लिए सही उत्तर को चिह्नित करते हैं!
ब्रश51

1
नहीं! iOS 7 :( (
हेडबैंग

यहाँ सबसे अच्छा जवाब stackoverflow.com/questions/20468335/…
डेमियन रोमितो सेप

जवाबों:


94

IOS6 में आपने तीन स्थानों पर इंटरफ़ेस ओरिएंटेशन का समर्थन किया है:

  1. .Plist (या लक्ष्य सारांश स्क्रीन)
  2. आपका UIApplicationDelegate
  3. UIViewController प्रदर्शित किया जा रहा है

यदि आपको यह त्रुटि मिल रही है, तो यह सबसे अधिक संभावना है क्योंकि आपके यूआईपीओवर में लोड हो रहा दृश्य केवल पोर्ट्रेट मोड का समर्थन करता है। यह गेम सेंटर, iAd, या आपके अपने दृष्टिकोण के कारण हो सकता है।

यदि यह आपका अपना विचार है, तो आप इसे अपने UIVIVController पर समर्थितInterfaceOrientations को ओवरराइड करके ठीक कर सकते हैं:

- (NSUInteger) supportedInterfaceOrientations
{
     //Because your app is only landscape, your view controller for the view in your
     // popover needs to support only landscape
     return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

यदि यह आपका स्वयं का दृश्य नहीं है (जैसे कि iPhone पर GameCenter), तो आपको यह सुनिश्चित करने की आवश्यकता है कि आपका .plist पोर्ट्रेट मोड का समर्थन करता है। आपको यह सुनिश्चित करने की भी आवश्यकता है कि आपका UIApplicationDelegate उन विचारों का समर्थन करता है जो पोर्ट्रेट मोड में प्रदर्शित होते हैं। आप अपने .plist को संपादित करके और फिर अपने UIApplicationDelegate पर समर्थितInterfaceOrientation को ओवरराइड करके ऐसा कर सकते हैं:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

3
UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRightबराबर UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRightहोता हैUIInterfaceOrientationMaskLandscape
वैलेरी पावलोव

4
या सिर्फ UIInterfaceOrientationMaskAll का उपयोग करें।
मार्क वैंग

उत्तम। भले ही "पोर्ट्रेट-ओनली" पॉपओवर लैंडस्केप में काम करेगा, लेकिन यह लैंडस्केप-ओनली व्यू कंट्रोलर को सामान्य रूप से प्रस्तुत नहीं कर सकता है।
नील एहार्द

नहीं! समाधान iOS 7 :( पर काम नहीं किया
।:

आईओएस 8 पर काम किया। हालांकि, प्लिस्ट के लिए पोर्ट्रेट सपोर्ट जोड़ना पड़ा। धन्यवाद।
यारोस्लाव

65

बहुत समय बिताने के बाद उप-वर्ग से बचने और कोड के टन को जोड़ने का एक तरीका खोज रहा है, यहां मेरा एक लाइन कोड समाधान है।

एक नया एक UIImagePickerController की श्रेणी बनाएं और जोड़ें

-(BOOL)shouldAutorotate{
    return NO;
}

बस आज के लिए इतना ही!


1
मेरे लिए भी काम किया है, पूरी तरह से परीक्षण नहीं किया है, लेकिन लगता है कि अब तक की चाल है।
migs647

2
यह सबसे अच्छा समाधान प्रतीत होता है।
जूलियन

2
काम करता है! यह बहुत अच्छा है, और इसने मुझे वास्तव में चुटकी में मदद की। धन्यवाद डॉ। लुइजी !!
बृक्ष

1
अच्छा लगा। आईओएस 6 पर मेरे लिए काम करता है। आप इस लचीलेपन को श्रेणी में पूर्ण लचीलेपन के लिए भी बना सकते हैं।
जारेड ईगन

3
iOS7 में काम नहीं करता है, श्रेणी विधि भी नहीं कहा जाता है (हालाँकि pch में शामिल है)
पीटर लैपिसु

43

एक और मामला है जो यह त्रुटि संदेश प्रकट हो सकता है। मैं घंटों तक खोज रहा था जब तक मुझे समस्या नहीं मिली। एक दो बार पढ़ने के बाद यह धागा बहुत मददगार साबित हुआ।

यदि आपका मुख्य दृश्य नियंत्रक लैंडस्केप ओरिएंटेशन के लिए घुमाया जाता है और आप एक कस्टम सब व्यू कंट्रोलर लगाते हैं, जो पोर्ट्रेट ओरिएंटेशन में प्रदर्शित होना चाहिए, तो यह त्रुटि संदेश तब हो सकता है जब आपका कोड इस तरह दिखता है:

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

यहाँ जाल xcode का सुझाव था "UIInterfaceOrientationPortrait" और मैंने इसकी परवाह नहीं की। पहली नज़र में यह सही लग रहा था।

सही मास्क नाम दिया गया है

UIInterfaceOrientationMaskPortrait

छोटे इन्फिक्स "मास्क" से अवगत रहें , अन्यथा आपका सबव्यू एक अपवाद और ऊपर उल्लिखित त्रुटि संदेश के साथ समाप्त हो जाएगा।

नई एनमों को थोड़ा शिफ्ट किया गया है। पुराने एनम अमान्य मान लौटाते हैं!

(UIApplication.h में आप नई घोषणा देख सकते हैं: UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait) )

समाधान है:

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

    // ATTENTION! Only return orientation MASK values
    // return UIInterfaceOrientationPortrait;

    return UIInterfaceOrientationMaskPortrait;
} 

तेजी से उपयोग में

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

5
उसी कारण से मेरे साथ हुआ
चेनएक्सिन

काश सेब सिर्फ रिटर्न प्रकार UIInterfaceOrientationMask बना होता है ताकि थोड़ा और स्पष्ट हो कि क्या वापस करने की आवश्यकता है।
लाइटनिंगस्ट्राइक

जैकपर्स का जवाब सही लगता है। लेकिन जब info.plist को देखें, तो UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight के साथ UISupportedInterfaceOrientations है। यहां कोई MASK नहीं
onmyway133

1
@onmyway: यह सच है, प्लिस्ट वैल्यू नहीं बदली। पहले iOS संस्करण में, Apple ने कोड के अंदर "गैर" मुखौटा मूल्यों का उपयोग किया था। यह कुछ विरासत सामान है। मुझे लगता है कि सेब थोड़ा आंतरिक मूल्यों को बदल रहा है अब आंतरिक रूप से।
जैकपियर

मेरा ऐप Xcode 6.2 के iPad सिम्युलेटर पर इस दुर्घटनाग्रस्त समस्या के बिना काम करता था। और कुछ दिन पहले Xcode 6.3 में अपग्रेड करने के बाद यह दुर्घटनाग्रस्त हो गया। अब यह समाधान मेरी समस्या को ठीक करता है। Thx a lot :-)
गोल्डन थम्ब

22

मेरे पास एक ऐसा ही मुद्दा था जब केवल एक परिदृश्य में छवि पिकर को प्रस्तुत किया गया था। जैसा कि डॉ। लुइजी द्वारा सुझाया गया है, मैंने अपने नियंत्रक की शुरुआत में निम्न श्रेणी जोड़ी।

// This category (i.e. class extension) is a workaround to get the
// Image PickerController to appear in landscape mode.
@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end

@implementation UIImagePickerController(Nonrotating)

- (BOOL)shouldAutorotate {
  return NO;
}
@end

अपने ViewController .m फ़ाइल के @ कार्यान्वयन से ठीक पहले इन पंक्तियों को जोड़ना आसान है।


मैं एक चित्र केवल app है! और मैं लैंडस्केप मोड में कैमरा दिखाना चाहता हूं। कोई भी समाधान?????
आसिफ हबीब

काम नहीं किया? मेरे पास एक ही मुद्दा है और मैंने आपके कोड की कोशिश की, लेकिन अभी भी एक ही अपवाद दिखाई देता है *** अनकहा अपवाद 'UIApplicationInvalidInterfaceOrientation' अपवाद के कारण समाप्त होने वाला ऐप, कारण: 'समर्थित अभिविन्यासों में एप्लिकेशन के साथ कोई सामान्य अभिविन्यास नहीं है, और shouldAutorotate YES वापस आ रहा है ..... ... मैंने UIimagePickerView श्रेणी पद्धति पर एक ब्रेकपॉइंट लगाया और वहां तक ​​पहुंचना चाहिए और फिर भी कोई अपवाद नहीं दिया। .... मेरा ऐप केवल लैंडस्केप ऐप है ... कृपया मेरी मदद करें
Vishal16

इसके अलावा SKStoreProductViewController को पोट्रेट में पेश करने के लिए मजबूर करने का काम करता है जब पूरा ऐप iOS 8 में लैंडस्केप होता है। आपको धन्यवाद।
यारोस्लाव

11

मैं अपने कोड में उसी त्रुटि संदेश का सामना कर रहा था। मैंने पाया, यह एक बग है जैसा कि Apple द्वारा रिपोर्ट किया गया है:

https://devforums.apple.com/message/731764#731764

उसका समाधान AppDelegate में इसे ठीक करना है। मैंने इसे लागू किया और यह मेरे लिए काम करता है!


वैसे, मुझे मूल रूप से यह पता चला: stackoverflow.com/questions/12522491/…
Robby

यह सही उत्तर था, Apple से प्रत्यक्ष, और फिर मुझे बस उसी निर्देशों का पालन करना था, लेकिन स्विफ्ट में iOS 8 को लक्षित करने वाले ऐप के लिए करें। सब कुछ बहुत अच्छा काम करता है। AppDelegate ने लैंडस्केप और पोर्ट्रेट दोनों के लिए SupportInterfaceOrientationsForWindow को सेट किया है, प्रत्येक अलग-अलग स्विफ्ट फ़ाइल को लैंडस्केप में func supportInterfaceOrientations ओवरराइड करता है ताकि दृश्य घूम न जाए, लेकिन जब एक चित्र दृश्य (मेरे मामले SKStoreProductViewController) को लोड करने की आवश्यकता होती है, तो यह काम करता है!
RanLearns

जी, बहुत सारे सुझाए गए समाधान हैं, और इस एक के पास सबसे अधिक अंक नहीं हैं, लेकिन यह वास्तव में सही है। IOS 10 और 9. पर परीक्षण किया गया और कुछ नहीं काम करता है।
डेमियन टर्नर

6

मुझे भी यही समस्या थी और यह जवाब https://stackoverflow.com/a/12523916 मेरे लिए काम करता है। आश्चर्य है कि अगर अधिक सुरुचिपूर्ण समाधान है।

मेरा कोड:

UIImagePickerController  *imagePickerController = [[NonRotatingUIImagePickerController alloc] init];
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

UIPopoverController  *popoverVC = [[UIPopoverController alloc] initWithContentViewController:imagePickerController];    

[popoverVC presentPopoverFromRect:frame   // did you forget to call this method?
                           inView:view
         permittedArrowDirections:UIPopoverArrowDirectionAny
                         animated:YES];

मैंने ऐसा करने की कोशिश की, लेकिन जब मैंने कोड को कॉल करने के लिए बटन पर क्लिक किया, लेकिन कुछ भी प्रदर्शित नहीं हुआ, तो भी मैंने @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @endकोड को जोड़ने की कोशिश की, लेकिन मेरा कोड NonRotatingUIImagePickerController का पता नहीं लगाएगा।
डेस्टिनी डॉन

1
कोई बात नहीं, यह अब NonRotatingUIImagePickerController का पता लगाता है, लेकिन अभी भी कुछ भी नहीं दिखाता ... @poetowen
डेस्टिनी डॉन

4

iOS 8 - आप पॉप में प्रदर्शित करने के लिए बिना किसी हैक के UIModalPresentationPopover का उपयोग कर सकते हैं। आदर्श नहीं लेकिन कुछ नहीं से बेहतर।

imagePicker.modalPresentationStyle = UIModalPresentationPopover;
imagePicker.popoverPresentationController.sourceView = self.view;
imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;

संपादित करें: शायद अलग-अलग UIModalPresentationStyles का प्रयास करें - शायद अधिक परिदृश्य में काम करेगा।


3
- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

This removes the crash.

2

एक अन्य विकल्प जिसने मेरे मुद्दों को हल किया, वह था UIImagePickerController का एक उपवर्ग बनाना और नीचे दी गई विधि को ओवरराइड करना

@interface MyImagePickerController ()

@end

@implementation MyImagePickerController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

UIImagePickerController के बजाय इसका उपयोग करें और यह सब ठीक काम करता है।


1

इस बग को ठीक करने के लिए एक श्रेणी बनाना वास्तव में सहायक है। और अपनी बनाई हुई श्रेणी को आयात करना न भूलें। यह UIImagePickerController के लिए लापता विधि को जोड़ देगा और iOS 6 पर इसे केवल पोर्ट्रेट में काम करने के लिए प्रतिबंधित कर देगा क्योंकि प्रलेखन राज्यों में btw।

अन्य समाधान काम कर सकते हैं। लेकिन iOS के लिए SDK के साथ 8.x को iOS 6.1 पर तैनात करने के लिए संकलित किया गया यह जाने का रास्ता लगता है।

.ह-फ़ाइल:

#import <UIKit/UIKit.h>

@interface UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;

@end

.M फ़ाइल:

#import "UIImagePickerController+iOS6FIX.h"

@implementation UIImagePickerController (iOS6FIX)

- (BOOL) shouldAutorotate {
    return NO;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

@end

1

स्विफ्ट 3

let imagePicker = UIImagePickerController()

imagePicker.modalPresentationStyle = .popover
imagePicker.popoverPresentationController?.sourceView = sender // you can also pass any view 

present(imagePicker, animated: true)

0

जब मैं इस दुर्घटना मुद्दे का सामना करना पड़ा परिवर्तित UIInterfaceOrientationPortraitकरने के लिए UIInterfaceOrientationMaskPortraitपरोक्ष एक वापसी मान के रूप में।

अधिक कोड पृष्ठभूमि UIPageViewControllerDelegate, आप सभी के लिए सिर्फ FYI करें।

 -(UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:
(UIPageViewController *)pageViewController
{
    # return UIInterfaceOrientationPortrait;    # wrong
    return UIInterfaceOrientationMaskPortrait;  # correct
}

0

मैं सिर्फ स्विफ्ट 4.x के मुद्दे को हल कर चुका हूं

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    configureVideoOrientation()
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil, completion: { [weak self] _ in
        self?.configureVideoOrientation()
    })
}

private func configureVideoOrientation() {
    guard let previewLayer = self.previewLayer, let connection = previewLayer.connection else { return }
    if connection.isVideoOrientationSupported {
        let orientation = UIApplication.shared.statusBarOrientation
        switch (orientation) {
        case .portrait:
            previewLayer.connection?.videoOrientation = .portrait
        case .landscapeRight:
            previewLayer.connection?.videoOrientation = .landscapeRight
        case .landscapeLeft:
            previewLayer.connection?.videoOrientation = .landscapeLeft
        case .portraitUpsideDown:
            previewLayer.connection?.videoOrientation = .portraitUpsideDown
        default:
            previewLayer.connection?.videoOrientation = .portrait
        }

        previewLayer.frame = self.view.bounds
    }
}

अपने जवाबों के लिए भी आप लोगों का शुक्रिया। मैंने काम किया कोड को काट दिया है और बस इसे फिर से काटा है।


0

स्विफ्ट 4 और पूरे ऐप को संभालने के लिए परिदृश्य में है और आपको पोर्ट्रेट में एकल नियंत्रक प्रस्तुत करने की आवश्यकता है। चित्र को देखने के लिए नियंत्रक में निम्नलिखित जोड़ना होगा:

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

open override var shouldAutorotate: Bool {
    return false
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.