2012-03-22 8 views
19

घुमाएं मेरा आवेदन मुख्य रूप से चित्र है, हालांकि एक ऐसा दृश्य है जो एक परिदृश्य अभिविन्यास की आवश्यकता है।UINavigationController Force

मेरे विचार एक UINavigationController के भीतर निहित हैं, जो (स्पष्ट रूप से) इस मुद्दे का कारण है।

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

UIViewController कि लैंडस्केप की आवश्यकता है इस है:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

अब, क्या होता है जब उपयोगकर्ता परिदृश्य UIViewController तक पहुँच जाता है, यह में दिखाया गया है

एक को छोड़कर सभी UIViewControllers इस राशि चित्र। उपयोगकर्ता फिर अपने फोन को घुमा सकते हैं और यह परिदृश्य में प्रदर्शित होता है क्योंकि मैं इसे (लैंडस्केप पर लॉक करना) चाहता हूं। उपयोगकर्ता तब पोर्ट्रेट UIViewController पर आगे बढ़ता है और वही होता है: यह परिदृश्य में शुरू होता है, फिर वे अपने फोन को घुमाते हैं और यह फिर से चित्र बन जाता है (और पोर्ट्रेट के लिए ताले)।

ऐसा लगता है कि UIViewControllers के बीच अभिविन्यास लॉकिंग की अनुमति है, हालांकि ऑटो-रोटेशन/प्रोग्रामेटिक रूप से ओरिएंटेशन बदलना किसी भी तरह अवरुद्ध है।

मैं सही अभिविन्यास को अपडेट करने के लिए फ़ोन को कैसे मजबूर करूं?

एक अस्थायी समाधान है: मैं डिवाइस के अभिविन्यास का पता लगा सकता हूं और डिवाइस को घुमाने के लिए एक संदेश दिखा सकता हूं यदि यह सही नहीं है, हालांकि यह इष्टतम नहीं है।

उत्तर

27

मुझे अपने अनुप्रयोगों में से एक के लिए एक ही आवश्यकता थी !!!

सौभाग्य से मुझे एक समाधान मिला!एसडीके 3.2.5 पर (viewWillAppear में :)

//set statusbar to the desired rotation position 
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; 

//present/dismiss viewcontroller in order to activate rotating. 
UIViewController *mVC = [[[UIViewController alloc] init] autorelease]; 
[self presentModalViewController:mVC animated:NO]; 
[self dismissModalViewControllerAnimated:NO]; 

PSTested:

आदेश मुख्य ViewController परिदृश्य रखने के लिए, कोई बात नहीं क्या अभिविन्यास से यह पॉप था/धक्का दे दिया, मैं निम्नलिखित काम किया आईओएस 5.0.1।

पीएस iOS पर 8 पिछले जवाब कुछ स्क्रीन अस्थिर परिणाम और भी है - यह स्थिर नहीं है (कुछ मामलों में यह अब मेरे लिए काम नहीं करता है।) तो, मेरी जरूरतों के लिए, मैं करने के लिए कोड बदल दिया है: (एआरसी)

//set statusbar to the desired rotation position 
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; 

[self.navigationController presentViewController:[UIViewController new] animated:NO completion:^{ 
    dispatch_after(0, dispatch_get_main_queue(), ^{ 
     [self.navigationController dismissViewControllerAnimated:NO completion:nil]; 
    }); 
}]; 

//I added this code in viewDidDissapear on viewController class, which will be popped back. 

उम्मीद है कि यह मदद करेगा!

+0

आईओएस 6beta1 पर काम करता है। धन्यवाद! – k06a

+0

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

+0

हां, मेरे पास एक ऐसी स्थिति थी जहां यह चाल सभी के बाद काम नहीं करती थी। इसका मतलब है कि, आपके एप्लिकेशन की कार्यक्षमता (तत्व ऑटोरेसाइजिंग या बहुत गहरा दृश्य/सबव्यू एकीकरण या शायद कुछ और) इस सुविधा को काम करने की अनुमति नहीं दे रहा है। माफ़ कीजिये। सरल मामलों में यह मदद करता है। –

20

इससे मदद मिल सकती है। आप उचित तरीके से दिखाई देने पर निम्नलिखित विधि को कॉल कर सकते हैं। जैसे में -viewWillAppear:animated

attemptRotationToDeviceOrientation प्रयास उपकरण के ओरिएंटेशन को सभी खिड़कियां घुमाने के लिए।

+ (void)attemptRotationToDeviceOrientation 

चर्चा

कुछ दृश्य नियंत्रकों करने के लिए एप्लिकेशन-विशिष्ट परिस्थितियों का उपयोग करने के shouldAutorotateToInterfaceOrientation की उनके क्रियान्वयन की वापसी मूल्य निर्धारित कर सकते हैं: विधि। यदि आपका विचार नियंत्रक ऐसा करता है, जब वे स्थितियां बदलती हैं, तो आपके ऐप को इस क्लास विधि को कॉल करना चाहिए। सिस्टम तुरंत नए पैरामीटर पर घूमने का प्रयास करता है। एक घूर्णन तब तक होता है जब प्रत्येक प्रासंगिक दृश्य नियंत्रक के कार्यान्वयन में YES देता है .AutorotateToInterfaceOrientation: विधि।

उपलब्धता

iOS 5.0 में उपलब्ध है और बाद में। http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html

+1

वाह +1 अच्छा टिप (और os5 में एक और गुडी)। इस समस्या ने मुझे सिरदर्द के कई घंटे दिए हैं। – danh

+0

वहां ऑटोरोटेशन सेटिंग्स सेट करने के लिए सभी प्रकार के फ़ंक्शन हैं, लेकिन उन्हें लगातार कॉल नहीं किया जाता है। मैंने - (BOOL) कोऑटोरोटेट { वापस नहीं किया; } लेकिन इसे कभी नहीं बुलाया गया। – shim

+0

बहुत बढ़िया - बहुत अच्छा! यह मुझे वर्षों से दूर कर दिया है! धन्यवाद – joehanna

4

इस का प्रयोग करें,

[[UIDevice currentDevice]performSelector:@selector(setOrientation:) withObject:(__bridge id)((void *)UIInterfaceOrientationLandscapeRight)]; 
+0

काम करता है लेकिन मुझे लगता है कि यह भविष्य में तोड़ सकता है क्योंकि इसकी शायद अनियंत्रित – MobileMon

+0

नहीं, यह सेब मूल अभिविन्यास है। मैंने इसका इस्तेमाल किया है और मेरे 2 ऐप्स के लिए सेब से अनुमोदित हो गया है। – Thangavel

+0

इसे लिखने का एक अच्छा तरीका: '[[UIDevice currentDevice] setValue: @ (UIDeviceOrientationLandscapeLeft) के लिए: @ "ओरिएंटेशन"] ' – meisel