iOS 6: मैं कुछ दृश्यों को चित्र बनाने और दूसरों को घुमाने की अनुमति कैसे दूं?


99

मेरे पास एक iPhone ऐप है जो UINavigationControllerड्रिल-डाउन इंटरफ़ेस पेश करने के लिए उपयोग करता है : पहला एक दृश्य, फिर दूसरा, चार स्तरों तक गहरा। मैं चाहता हूं कि पहले तीन दृश्य पोर्ट्रेट ओरिएंटेशन के लिए सीमित हों और केवल अंतिम दृश्य को परिदृश्य को घुमाने की अनुमति दी जाए। जब चौथे दृश्य से तीसरे और चौथे दृश्य की ओर लौट रहे थे तो लैंडस्केप ओरिएंटेशन में मैं चाहता था कि सब कुछ पोर्ट्रेट पर वापस आ जाए।

IOS 5 में मैंने shouldAutorotateToInterfaceOrientation:अपने प्रत्येक दृश्य नियंत्रकों में स्वीकार्य योगों के लिए YES को वापस करने के लिए परिभाषित किया। जैसा कि दृश्य नियंत्रक # 4 से # 3 पर लौटते समय डिवाइस परिदृश्य परिदृश्य में आयोजित किया जा रहा था, भले ही चित्र में वापसी सहित, ऊपर वर्णित के रूप में काम किया गया।

IOS 6 में सभी व्यू कंट्रोलर लैंडस्केप के लिए घूमते हैं, जिन्हें तोड़कर उनका मतलब नहीं था। IOS 6 रिलीज नोट कहते हैं

अधिक जिम्मेदारी ऐप और ऐप डेलीगेट के पास जा रही है। अब, आईओएस कंटेनर (जैसे कि UINavigationController) अपने बच्चों को यह निर्धारित करने के लिए परामर्श नहीं करते हैं कि उन्हें ऑटोरोटेट करना चाहिए या नहीं। [...] सिस्टम शीर्ष-पूर्ण-स्क्रीन व्यू कंट्रोलर (आमतौर पर रूट व्यू कंट्रोलर) को उसके समर्थित इंटरफेस ओरिएंटेशन के लिए पूछता है जब भी डिवाइस घूमता है या जब भी कोई व्यू कंट्रोलर फुल-स्क्रीन मोडल प्रस्तुति शैली के साथ प्रस्तुत किया जाता है। इसके अलावा, समर्थित अभिविन्यास केवल तभी पुनर्प्राप्त किए जाते हैं जब यह दृश्य नियंत्रक अपनी shouldAutorotateविधि से YES देता है । [...] यह प्रणाली निर्धारित करती है कि एप की supportedInterfaceOrientationsForWindow:विधि द्वारा लौटाए गए मान supportedInterfaceOrientationsको शीर्ष-सर्वाधिक पूर्ण-स्क्रीन नियंत्रक की विधि द्वारा लौटाए गए मूल्य को प्रतिच्छेद करके समर्थित है या नहीं ।

इसलिए मैंने उपशमन किया UINavigationController, अपनी MainNavigationControllerबूलियन संपत्ति दी landscapeOKऔर इसका उपयोग अंदर की ओर उन्मुख अभिविन्यासों को वापस करने के लिए किया supportedInterfaceOrientations। फिर मेरे प्रत्येक दृश्य में नियंत्रक 'viewWillAppear: तरीकों में मेरे पास एक पंक्ति है

    [(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

मेरे बताने के लिए MainNavigationController इच्छित व्यवहार ।

यहाँ सवाल आता है: यदि मैं अब पोर्ट्रेट मोड में अपने चौथे दृश्य पर नेविगेट करता हूं और फोन को घुमाता हूं तो यह परिदृश्य में घूमता है। अब मैं अपने तीसरे दृश्य पर वापस जाने के लिए वापस बटन दबाता हूं जो केवल पोर्ट्रेट काम करने वाला है। लेकिन यह वापस नहीं घूमता है। मैं यह कैसे कर सकता हूँ?

मैंने कोशिश की

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]

viewWillAppearमेरे तीसरे दृश्य नियंत्रक की विधि में, लेकिन यह कुछ भी नहीं करता है। क्या यह गलत तरीका है कॉल करने के लिए या शायद गलत जगह पर कॉल करने के लिए या क्या मुझे पूरी तरह से पूरी तरह से लागू करना चाहिए?

जवाबों:


95

मुझे एक ही समस्या थी और एक समाधान मिला जो मेरे लिए काम करता है। इसे काम करने के लिए, आपके UINavigationController में लागू करना पर्याप्त नहीं है- (NSUInteger)supportedInterfaceOrientations । आपको अपने नियंत्रक # 3 में इस पद्धति को लागू करने की भी आवश्यकता है, जो कि पोर्ट्रेट नियंत्रक # 4 के बाद केवल पोर्ट्रेट होने के लिए पहला है। तो, मेरे पास मेरे UINavigationController में निम्नलिखित कोड है:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.isLandscapeOK) {
        // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

कंट्रोलर # 3 में, निम्नलिखित जोड़ें:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

आपको अपने दृश्य नियंत्रकों # 1, # 2, और # 4 में कुछ भी जोड़ने की आवश्यकता नहीं है। यह मेरे लिए काम करता है, मुझे उम्मीद है कि यह आपकी मदद करेगा।


8
आपने कुछ हल किया जो लोग महीनों तक हल करने की कोशिश कर रहे थे! आप इसके लिए बहुत सारे श्रेय के पात्र हैं! मैंने UIViewController पर एक वर्ग में supportInterfaceOrientations जोड़ा और यह पूरी तरह से उन पोर्ट्रेट-केवल नियंत्रकों के लिए एक डिफ़ॉल्ट के रूप में काम करता है।
dwery

3
SO पर 100 अलग-अलग उत्तरों के बीच, यह वह है जो वास्तव में काम करता है। धन्यवाद :-)
क्रिस्टर नॉर्डविक

16
मैंने इसे स्थापित किया है और अभी भी गलत अभिविन्यास प्राप्त कर रहा है जब चित्र से दृश्य परिदृश्य में केवल परिदृश्य तक सीमित है। यह परिदृश्य को नहीं दर्शाता है - कोई और अभी भी इसे देख रहा है?
ओड बेन डोव

1
क्या होगा यदि वांछित लैंडस्केप व्यू कंट्रोलर को एक सेगमेंट से प्रस्तुत किया जा रहा है और कोई नेविगेशन कंट्रोलर नहीं है?
jesses.co.tt 19

1
वापसी प्रकार के रूप में NSUInteger होने के लिए पिछले एक को संपादित करें।
अनुपस्थित

68

एक CustomNavigationController जोड़ें

इसमें इन विधियों को ओवरराइड करें:

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

अब प्लिस्ट में सभी ओरिएंटेशन जोड़ें

यहां छवि विवरण दर्ज करें

दृश्य नियंत्रक में केवल आवश्यक लोगों को जोड़ें:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

ये तरीके नेविगेशन कंट्रोलर विधियों को ओवरराइड करते हैं


5
आप वास्तव में इस जवाब के साथ इसे nailed! बहुत बहुत धन्यवाद। आपने वास्तव में बहुत मदद की। थोड़ी देर के लिए यह मेरे लिए एक बड़ी समस्या रही है। अच्छा काम।
K2Digital

धन्यवाद! यह पता करने के लिए मुझे इतना समय और ऊर्जा लगी!
bkbeachlabs

आप जीवन रक्षक हैं .... यह मेरे ऐप में भी काम करता है। वास्तव में मैं अपने ऐप में जो चाहता हूं वह यह है कि मेरे पास सभी ViewControllerपोर्ट्रेट मोड में हैं और मेरा एक ViewControllerलैंडस्केप और पोर्ट्रेट मोड में है। मैं आईओएस 5.0 और आईओएस 6.0 दोनों में भी समर्थन देता हूं, यही कारण है कि मैं चारों ओर काम करने के लिए भ्रमित हूं लेकिन यह बहुत अच्छा समाधान है। मैं अपने मूल दृश्य नियंत्रक में CustomNavigationController जोड़ता हूं और अपनी आवश्यकताओं के अनुसार समर्थन देता हूं। एक बार फिर से धन्यवाद।
भाविन_म

बहुत खुबस। वास्तव में मुझे जो चाहिए था। धन्यवाद।
mszaro

क्या होगा यदि वांछित लैंडस्केप व्यू कंट्रोलर को एक सेगमेंट से प्रस्तुत किया जा रहा है और कोई नेविगेशन कंट्रोलर नहीं है?
jesses.co.tt

9

एसओ पर अनगिनत समान प्रश्नों में हर उत्तर को देखने के बाद, किसी भी उत्तर ने मेरे लिए काम नहीं किया, लेकिन उन्होंने मुझे कुछ विचार दिए। यहां बताया गया है कि मैंने समस्या का समाधान कैसे किया:

सबसे पहले, सुनिश्चित करें कि आपके प्रोजेक्ट के लक्ष्य में आपके समर्थित इंटरफ़ेस ओरिएंटेशन में वे सभी ओरिएंटेशन हैं जो आप अपने घूर्णन दृश्य के लिए चाहते हैं।

यहां छवि विवरण दर्ज करें

इसके बाद, की एक श्रेणी बनाएं UINavigationController(क्योंकि Apple कहता है कि इसे उप-वर्ग में न डालें):

@implementation UINavigationController (iOS6AutorotationFix)

-(BOOL)shouldAutorotate {
    return [self.topViewController shouldAutorotate];
}

@end

उस श्रेणी और दृश्य नियंत्रक को आयात करें, जिसे आप RotatingViewControllerअपने उच्चतम स्तर के दृश्य नियंत्रक में घुमाना चाहते हैं (जिसे मैं कॉल करूंगा ), जिसमें आपका नेविगेशन नियंत्रक होना चाहिए। उस दृश्य नियंत्रक में, shouldAutorotateनिम्नानुसार लागू करें । ध्यान दें कि यह वही दृश्य नियंत्रक नहीं होना चाहिए जिसे आप घुमाना चाहते हैं।

-(BOOL)shouldAutorotate {

    BOOL shouldRotate = NO;

    if ([navigationController.topViewController isMemberOfClass:[RotatingViewController class]] ) {
        shouldRotate = [navigationController.topViewController shouldAutorotate];
    }

    return shouldRotate;
}

अंत में, आपके RotatingViewController, कार्यान्वित shouldAutorotateऔर supportedInterfaceOrientationsनिम्नानुसार:

-(BOOL)shouldAutorotate {
    // Preparations to rotate view go here
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown; // or however you want to rotate
}

ऐसा करने के लिए आपको इसकी आवश्यकता है क्योंकि iOS 6 शीर्ष दृश्य नियंत्रक के बजाय रूट व्यू कंट्रोलर को रोटेशन का नियंत्रण देता है। यदि आप एक व्यक्तिगत दृश्य के रोटेशन को स्टैक में अन्य विचारों की तुलना में अलग तरह से व्यवहार करना चाहते हैं, तो आपको रूट दृश्य नियंत्रक में इसके लिए एक विशिष्ट मामला लिखने की आवश्यकता है।


2
यह एक उत्कृष्ट उत्तर है जो अधिक प्यार का हकदार है। यहां जानकारी का वह टुकड़ा है जिसमें यह शामिल है कि मैं कहीं और नहीं मिल सका, और जो महत्वपूर्ण है: यदि आप एक व्यक्तिगत दृश्य के रोटेशन को स्टैक में अन्य विचारों की तुलना में अलग तरह से व्यवहार करना चाहते हैं, तो आपको इसके लिए एक विशेष मामले को रूट में लिखने की आवश्यकता है नियंत्रक देखें
shimim

मुझे लगता है कि यह काम करेगा अगर आपके पास शुरुआती नियंत्रक के रूप में आपके ऐप के स्टोरीबोर्ड के पहले सदस्य के रूप में एक नेविगेशनकंट्रोलर है लेकिन उस मामले के बारे में क्या है जब प्रारंभिक नियंत्रक बस एक ViewController है?
बतख

4

मेरे पास ब्रायन के उत्तर पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं यहां अपना नोट जोड़ूंगा।

ब्रायन ने उल्लेख किया कि iOS6 रूटव्यूकंट्रोलर को रोटेशन कंट्रोल देता है - यह न केवल एक UINavigationController के रूप में उल्लेख किया जा सकता है, बल्कि एक UITabBarController भी हो सकता है, जो मेरे लिए था। मेरी संरचना इस तरह दिखती है:

  • UITabBarController
    • UINavigationController
      • UIViewControllers ...
    • UINavigationController
      • UIViewControllers ...

इसलिए मैंने पहले एक कस्टम UITabBarController में विधियों को जोड़ा, फिर एक कस्टम UINavigationController में और फिर अंतिम विशिष्ट UIViewController में।

UITabBarController और UINavigationController से उदाहरण:

- (BOOL)shouldAutorotate {
    return [self.viewControllers.lastObject shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}

मैंने वास्तव में अपने रूट व्यू कंट्रोलर में एक उदाहरण चर के रूप में एक UITabBarController का उपयोग किया था क्योंकि आप 6.0 से पहले iOS संस्करणों में UITabBarController को उप-वर्ग करने के लिए नहीं माना जाता है और मुझे वापस iOS 5.0 का समर्थन करने की आवश्यकता है।
ब्रायन

@micmdk मुझे एक ही समस्या है। कृपया सलाह दें कि कैसे हल किया जाए, मैंने आपका कोड कॉपी किया है और कस्टम नेविगेशन कंट्रोलर और customUabbarController में डाल दिया है और ब्रायन के गाइड के रूप में अन्य दृश्य नियंत्रक सेट किया है। लेकिन अभी भी पोर्ट्रेट में फिक्स्ड व्यू कंट्रोलर नहीं मिल रहा है।
राम एस

@ ब्रायन मुझे भी यही समस्या है। कृपया सलाह दें कि कैसे हल किया जाए, मैंने आपका कोड कॉपी किया है और कस्टम नेविगेशन कंट्रोलर और customUabbarController में डाल दिया है और अन्य दृश्य नियंत्रक को Micmdk के गाइडेड के रूप में सेट किया है। लेकिन अभी भी ios8 में पोर्ट्रेट में फिक्स्ड व्यू कंट्रोलर नहीं मिल रहा है।
राम एस

3

मैं अपने प्रश्न का आंशिक उत्तर देना चाहूंगा। मुझे काम करने के लिए, viewWillAppearमेरी तीसरी विधि में प्रयुक्त कोड की निम्न पंक्ति मिली UIViewController:

[[UIDevice currentDevice] 
      performSelector:NSSelectorFromString(@"setOrientation:") 
           withObject:(id)UIInterfaceOrientationPortrait];

लेकिन मुझे वास्तव में यह समाधान पसंद नहीं है। यह एक रीड-ओनली प्रॉपर्टी को असाइन करने के लिए एक ट्रिक का उपयोग कर रहा है जो Apple प्रलेखन के अनुसार डिवाइस के भौतिक अभिविन्यास का प्रतिनिधित्व करता है। यह iPhone को उपयोगकर्ता के हाथ में सही अभिविन्यास पर जाने के लिए कहने जैसा है।

मैं अपने ऐप में इसे छोड़ने के लिए बहुत लुभाता हूं क्योंकि यह बस काम करता है। लेकिन यह सही नहीं लगता है इसलिए मैं एक स्वच्छ समाधान के लिए प्रश्न को खुला छोड़ना चाहता हूं।


4
यदि आप इसे वहां छोड़ देते हैं, तो आपका एप्लिकेशन सबसे अधिक संभावना खारिज कर दिया जाएगा। मैं इसका भी हल ढूंढ रहा हूं, लेकिन लगता है कि यह संभव नहीं है। सभी मुझे मिल सकता है इस सवाल का जवाब है: stackoverflow.com/questions/7196300/… यह काम करता है, लेकिन किसी कारण से यह मेरे एक दृश्य नियंत्रक में बटन स्पर्श से निपटने को तोड़ता है
लोप

मैंने अपना चांस लिया है और Apple को सबमिट किया है। अभी भी समीक्षा की प्रतीक्षा कर रहा हूं ... मैं आपको पोस्ट करता रहूंगा।
हैराल्ड बोघोलज़

Apple ने इस जगह हैक के साथ मेरे ऐप को मंजूरी दे दी, हाँ! मुझे आशा है कि भविष्य के iOS अपडेट में यह मुझ पर पीछे नहीं हटेगा। इस बीच मैं अभी भी एक स्वच्छ समाधान के लिए सुझाव के लिए खुला हूँ!
४ge पर हैरल्ड बोघोलज़

1
@ हैराल्डबोजहोलज गट शक्कर। लेकिन जब मैं ARC के साथ ARC के साथ नए xCode में काम कर रहा हूं तो ans का उपयोग नहीं कर सकता। मैं "NSInteger का कास्ट (उर्फ int) आईडी को प्राप्त कर रहा हूं, ARC PerformSelector के साथ अस्वीकृत हो सकता है क्योंकि रिसाव का कारण हो सकता है क्योंकि इसका चयनकर्ता अज्ञात है" मैं इसे कैसे हल कर सकता हूं? अगर हमने समाधान निकाला तो मैं वास्तव में आपसे अवगत हूं। जब मैं कुछ रिसाव डेटा के कारण ऐप क्रैश की तुलना में पर्टिकुलर व्यू के लिए एआरसी बंद करता हूं। कृपया मुझे सुझाव दें
हितार्थ 14

4
निजी API का उपयोग करना कभी समाधान नहीं है।
जेवियर सोतो

2

यह मैं ios 6.0 में अभिविन्यास समर्थन के लिए उपयोग कर रहा हूं

-(BOOL)shouldAutorotate{
    return YES;
}  

 - (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{  
  return UIInterfaceOrientationPortrait;
}

1

होने के नाते यह एक उच्च देखा गया धागा है। मैंने सोचा कि मैं जो भी मानता हूं उसे जोड़ दूंगा जो सबसे आसान जवाब है। यह ios8 और ऊपर के लिए काम करता है

-(BOOL)shouldAutorotate
{
    return YES;
}

तथा

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

बस। का आनंद लें!

ओह, और मेरे ViewControllers एक नेविगेशन नियंत्रक में एम्बेडेड हैं, जिसे मुझे किसी भी तरह से उप-वर्ग या कॉन्फ़िगर करने की आवश्यकता नहीं थी।


0

यह सभी के लिए काम नहीं कर सकता है, लेकिन यह मेरे लिए बहुत अच्छा काम करता है। लागू करने के बजाय ...

[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

मेरे सभी नियंत्रकों में देखने के दौरान, मैंने UINavigationControllerDelegate पद्धति को ओवरराइड करके अपने UINavigationController उपवर्ग के अंदर इस प्रक्रिया को केंद्रीकृत करने का निर्णय लिया।navigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    self.previousVCLandscapeOK = self.isLandscapeOK; // Store the current VC's orientation preference before pushing on the new VC so we can set this again from within the custom "back" method
    self.isLandscapeOK = NO; // Set NO as default for all VC's
    if ([viewController isKindOfClass:[YourViewController class]]) {
        self.isLandscapeOK = YES;
    }
}

मैंने पाया है कि जब नौसेना स्टैक से वीसी को पॉपिंग करने पर यह प्रतिनिधि विधि नहीं मिलती है। यह मेरे लिए कोई समस्या नहीं थी क्योंकि मैं अपने UINavigationController उपवर्ग के भीतर से पीछे की कार्यक्षमता को संभाल रहा हूं ताकि मैं विशिष्ट वीसी के लिए उचित नेविगेशन बार बटन और क्रियाएं सेट कर सकूं ...

if ([viewController isKindOfClass:[ShareViewController class]]) {

    UIButton* backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 57, 30)];
    [backButton setImage:[UIImage imageNamed:@"back-arrow"] forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem* backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    viewController.navigationItem.leftBarButtonItem = backButtonItem;

    UIImageView* shareTitle = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"share-title"]];
    [shareTitle setContentMode:UIViewContentModeScaleAspectFit];
    [shareTitle setFrame:CGRectMake(0, 0, shareTitle.frame.size.width - 10, shareTitle.frame.size.height - 10)];
    viewController.navigationItem.titleView = shareTitle;

} else if(...) {
    ...
}

यहाँ है कि मेरी backविधि क्या कुलपति के स्टैक से पॉपिंग को संभालने और उचित रोटेशन वरीयता सेट करने के लिए पसंद करती है ...

- (void)back {
    self.isLandscapeOK = self.previousVCLandscapeOK;
    self.previousVCLandscapeOK = NO;
    [self popViewControllerAnimated:YES];
}

तो, जैसा कि आप देख सकते हैं, मूल रूप से यह सब हो रहा है, मैं पहले मुझे दो गुण स्थापित कर रहा हूं ...

@property (nonatomic) BOOL isLandscapeOK;
@property (nonatomic) BOOL previousVCLandscapeOK;

में navigationController:willShowViewController:animated:जो क्या समर्थित झुकाव कि कुलपति है कि के बारे में प्रस्तुत करने के लिए भीतर कर रहे हैं का निर्धारण करेगा। जब एक वीसी को पॉपअप किया जाता है, तो मेरा कस्टम "बैक" विधि कहा जा रहा है और मैं उसके बाद isLandscapeOK सेट कर रहा हूं जो पिछलेVCLandscapeOK मान के माध्यम से संग्रहीत किया गया था।

जैसा कि मैंने कहा, यह सभी के लिए काम नहीं कर सकता है, लेकिन यह मेरे लिए बहुत अच्छा काम करता है और मुझे अपने प्रत्येक दृश्य नियंत्रकों में कोड जोड़ने के बारे में चिंता करने की आवश्यकता नहीं है, मैं इसे सभी को UINavigationController उपवर्ग में केंद्रीकृत रखने में सक्षम था।

आशा है कि यह किसी की मदद करता है जैसा कि उसने मुझे किया था। धन्यवाद, जेरेमी।



0

आप iOS 6 ऐप पोर्ट्रेट को फोर्स करना चाहते हैं, तभी आप नीचे दिए गए तरीकों से एक UIViewController सबक्लास को जोड़ सकते हैं

- (BOOL)shouldAutorotate {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    } else {
        return NO;
    }
}


- (NSUInteger)supportedInterfaceOrientations {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return UIInterfaceOrientationMaskAll;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

2
समस्या यह है कि जब तक वह दृश्य मूल दृश्य नहीं है (जो कि इस प्रश्न में नहीं है), चाहिए नहीं कहा जाता है।
ब्रायन

जो भी कारण के लिए वापसी प्रकार NSUIntegerएक चेतावनी फेंकता है इसके बावजूद कि यह सही var प्रकार है। यदि आपके पास UIInterfaceOrientationMaskइसके बजाय OCD का उपयोग है ।
क्रिस जे।

इसके अलावा, इस समाधान ने एक मोडल व्यू कंट्रोलर (एक कैमरा व्यू) के लिए पूरी तरह से काम किया है, जो बिना किसी आवश्यकता के UINavigationController की उपवर्ग के लिए है। मैं अनुमान लगा रहा हूं कि मॉडल्स का इलाज स्वतंत्र रूप से किया जाता है। मूल प्रश्न के लिए प्रासंगिक नहीं है, लेकिन डिज़ाइन वार करने के लिए उपयोगी जानकारी है।
क्रिस जे।

0

मैं अपने सभी कुलपतियों को एक को छोड़कर पोर्ट्रेट ओरिएंटेशन के लिए लॉक करना चाहता था। इसी से मेरा काम बना है।

  1. Plist फ़ाइल में सभी झुकावों के लिए समर्थन जोड़ें।
  2. रूट व्यू कंट्रोलर में, विंडो के ऊपर व्यू कंट्रोलर दैट्स के प्रकार का पता लगाएं और तदनुसार समर्थितइंटरफेस ऑप्रेशन विधि में ऐप के ओरिएंटेशन को सेट करें । उदाहरण के लिए, मुझे अपने ऐप को केवल तभी घुमाने की ज़रूरत थी जब वेबवॉच स्टैक के शीर्ष पर था। यहाँ मैंने अपने rootVC में क्या जोड़ा है:

    -(NSUInteger)supportedInterfaceOrientations
    {
        UIViewController *topMostViewController = [[Utils getAppDelegate] appNavigationController].topViewController;
        if ([topMostViewController isKindOfClass:[SVWebViewController class]]) {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        }
        return UIInterfaceOrientationMaskPortrait;
    }

Trunal, यह कुछ महीने पुराना है लेकिन क्या आप इस बारे में थोड़ा और विस्तार दे सकते हैं कि आप किस तरह के व्यू कंट्रोलर का पता लगाते हैं। विशेष रूप से मुझे यकीन नहीं है कि आप यहां जा रहे हैं [[Utils getAppDelegate] appNavigationController]। यूटिल्स मैं अनुमान लगा रहा हूं कि आपके पास कुछ वर्ग है, लेकिन मैं नुकसान में हूं कि आप इसमें क्या करते हैं। कोई भी मदद बहुत अच्छी रहेगी!
बेन

0

मेरे पास @micmdk उत्तर के तहत @Ram S प्रश्न का उत्तर देने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं यहां अपना नोट जोड़ूंगा।

आप का उपयोग करते हैं UITabBarController , को बदलने की कोशिश self.viewControllers.lastObject लिए @ micmdk के कोड में self.selectedViewController इस तरह:

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

0

आप अपने सभी कंट्रोलर क्लासेस में उन सभी को देखें, जिन्हें आपके ऐप के PLIST में परिभाषित किया गया है, उन्हें अलग-अलग ओरिएंटेशन में प्रस्तुत किया जा सकता है।

हालाँकि, एक nontrivial यूजर इंटरफेस में आपको दर्जनों वर्गों में इसे जोड़ने के लिए एक समस्या का सामना करना पड़ सकता है और आप उन सभी को कई सामान्य का उप-वर्ग नहीं बनाना चाहते हैं जो इसका समर्थन करते हैं (MyBaseTableViewController, MyBaseNatigationController और MyBaseTabBarController)।

चूँकि आप सीधे UIViewController पर उन तरीकों / var को ओवरराइड नहीं कर सकते, आप ऐसा कर सकते हैं कि इसके उपवर्गों पर जो आमतौर पर UITableViewController, UINavigationController और UITabBontController की तरह आपके आधार वर्ग हैं।

तो आप कुछ एक्सटेंशन लागू कर सकते हैं और फिर भी सेटअप कर सकते हैं MyPreciousViewController को इस स्विफ्ट 4 कोड स्निपेट जैसे अन्य सभी की तुलना में एक अलग झुकाव में दिखाने के लिए:

extension UITableViewController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

    if let last = self.navigationController?.childViewControllers.last,
        last != self {
            return last.supportedInterfaceOrientations
    } else {
        return [.portrait]
    }
    }
}

extension MyPreciousViewController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

    return [.portrait,.landscape]
    }
}


extension UINavigationController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return [.portrait]
    }
}


extension UITabBarController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return [.portrait]
    }
}

0

मैंने एक ही तरह का मसला हल किया है।

यदि आप UINavigationControllerव्यू कंट्रोलर्स को पुश करने के लिए उपयोग कर रहे हैं , तो आपको नीचे दिए गए तरीके सेट करने होंगे।

extension UINavigationController{

    override open var shouldAutorotate: Bool {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return true
        }
        return false
    }

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return .portrait
        }
        return .landscapeRight

    }
    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return .portrait
        }
        return .landscapeRight
    }
}

LoginViewControllerउपयोग के स्थान पर जिसे UIViewControllerआप दिखाना चाहते हैं। मेरे मामले में, मैं दिखाना चाहता हूँ LoginViewControllerमें Portraitमोड अन्य ViewControllersमें landscapeमोड।


-1

कृपया इस समस्या को हल करने के लिए निम्न विधि का उपयोग करें

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

आप चाहते हैं केवल अभिविन्यास लौटें !!!


3
मैंने वैसा ही किया, जैसा मैंने लिखा है। यह मेरे विचार नियंत्रक को घूमने से रोकता है, लेकिन जब मैं इसमें लौटता हूं तो यह केवल समर्थित अभिविन्यास पर वापस जाने के लिए मजबूर नहीं करता है।
हैराल्ड बोघोलज़

यह मेरे लिए काम नहीं करता है। यहां तक ​​कि इसे मेरे दृश्य नियंत्रक में शामिल करने के बावजूद, दृश्य अभी भी घूमता है। क्या देता है?
शिम

मैक्सफायरोसेप्शन के लिए डाउनवोट क्यों? यह मेरे लिए काम करता है और @Flo द्वारा दी गई एक ही विधि में कई उतार-चढ़ाव हैं।
वीरूमैक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.