2010-11-02 18 views
13

मेरे पास स्प्लिट व्यू टेम्पलेट का उपयोग करके मेरा आईपैड एप्लिकेशन बनाया गया है। मुझे आश्चर्य है कि मेरे एप्लिकेशन को लैंडस्केप मोड में प्रतिबंधित करने का सबसे अच्छा तरीका क्या है?मेरे ऐप को लैंडस्केप मोड में कैसे प्रतिबंधित करें?

मैं DetailViewController.m

में shouldAutorotateToInterfaceOrientation: विधि अधिभावी
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
} 

लेकिन 4.2 जीएम अभी भी त्रुटिपूर्ण है की कोशिश की है और यह नियंत्रक दृश्य दिखाने के लिए विफल रहता है। मेरे पास अन्य विकल्प क्या हैं?

अग्रिम धन्यवाद।

Update1

  • मैं पहले से ही एक बग रिपोर्ट दायर की है: Bug ID #8620135

  • मेरा ऐप लगभग समाप्त हो गया है और मैं एक खोजने के लिए काम arround के बाद से मैं नहीं वे सोचते हैं 4.2 आधिकारिक तौर पर बाहर आने से पहले इसे हल करने जा रहे हैं (जीएम पहले से बाहर है!)

    बग को फिर से बनाने के लिए, बस स्प्लिट व्यू टेम्पलेट का उपयोग करें और ऊपर ओवरराइड करें UIViewControllers (RootViewController या DetailViewControllers) में से किसी में विधि

UPDATE2

मैं पाया है एक काम के आसपास। (के लिए पूर्ण काम के आसपास Update3 देखें)

सेट UISupportedInterfaceOrientations केवल लैंडस्केप समर्थन करने के लिए, इस DetailViewController सही ढंग से शुरू करने के लिए (इसलिए सही ढंग से दिखाया गया है)

<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

लेकिन अगर इजाजत दी लैंडस्केप मोड में शुरू करने के लिए एप्लिकेशन के लिए बाध्य करेगा आप डिवाइस घुमाने के लिए, यह पोर्ट्रेट मोड बदल जाता है !!!, तो अभी भीshouldAutorotateToIntercafeOrientation ओवरराइड करने के लिए आवश्यक है:

: उपरोक्त

चर्चा के रूप में

यदि यह कोई बग नहीं होगा तो मैं दृश्य नियंत्रक द्वारा समर्थित नहीं है जो एक अभिविन्यास में ऐप शुरू करते समय चेतावनी या निष्पादन त्रुटि, अपवाद या कुछ की अपेक्षा करेगा। इसके अलावा, केवल DetailViewController क्यों नहीं दिखाता है? यदि यह विनिर्देशन होगा, तो रूटव्यू कंट्रोलर को तब भी लोड करने में असफल होना चाहिए। क्या आपको नहीं लगता? धन्यवाद के लिए आप ... मदद;)

Update3

आगे परीक्षण के बाद मैंने महसूस किया है कि इसके बाद के संस्करण काम के आसपास कुछ मामलों में काम नहीं करता। उदाहरण के लिए जब डिवाइस परिदृश्य में होता है तो ऐप शुरू करने पर काम नहीं करेगा! असली समस्या यह प्रतीत होती है कि आईओएस 4.2 जीएम UISplitViewController में इसके सभी नियंत्रकों की आवश्यकता है कि सभी घूर्णन इसके लोड समय पर उपलब्ध हों। इसलिए उसे चालित करने के लिए जरूरी है ताकि वह लैंडस्केप मोड में लोड हो और फिर उसे अपने व्यू कंट्रोलर को घुमाने की अनुमति न दें।

तो इस कष्टप्रद आईबग के लिए यहां नया काम है।

चरण 1: तो जैसे सेट Info.plist:

<key>UISupportedInterfaceOrientations</key> 
<array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
</array> 

चरण 2 DetailViewController.m या (SPLITVIEW खाका से) ज

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135. 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    //WORK-ARROUND: Bug ID# 8620135. 
    if (lockRotation) { 
     return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
    }else{ 
     return YES; 
    } 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called 
    lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135. 
} 
- (void)viewDidAppear:(BOOL)animated { 
    //set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called 
    lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135. 
    [super viewDidAppear:animated]; 
} 

महत्वपूर्ण नोट में एक नया झंडा सेट करें: कृपया ध्यान दें कि यह बग केवल तब दिखाई देता है जब UISplitViewController लोड होता है और हर बार उसका दृश्य प्रकट होता है। इसलिए, इस बग को देखने के लिए सुनिश्चित करें कि ऐप को पहले समाप्त कर दिया गया था।

+1

शायद एक बग फाइल करें? ;) –

+0

प्रश्न बताता है कि आप DetailViewController में परिवर्तन कर रहे हैं, क्या यह सही नियंत्रक विधि को ओवरराइड करने के लिए है? –

+0

मैंने पहले ही बग – nacho4d

उत्तर

2

मैंने 500 से seems to be the same thing you're facing की एक बाउंटी के साथ एक प्रश्न पूछा।

मेरे सीमित अनुभव से लैंडस्केप-केवल आईपैड ऐप की तुलना में केवल लैंडस्केप-आईफोन ऐप बनाना आसान है। मुझे यकीन नहीं है कि इसमें कोई फर्क क्यों पड़ता है, लेकिन ऐप्पल ने इसे परिदृश्य बनाने के लिए कदम उठाए हैं-केवल अपने ही काम नहीं करते हैं।

+0

मुझे लगता है कि मुझे उस धागे में एक संकेत मिला है, मैंने यही किया है और यह काम करता है लेकिन यह निश्चित रूप से एक काम-आसपास है। यह जरूरी नहीं होना चाहिए मुझे विश्वास है। मेरा अपडेट 2 देखें। – nacho4d

+0

यहां तक ​​कि कठिन मुझे अपने आप को जवाब मिला ... यह जवाब मुझे इसका नेतृत्व करता है। तो धन्यवाद;) – nacho4d

0

यदि आप पहले से नहीं हैं, तो यह iPhone app in landscape mode देखें। मैं बस UISupportedInterfaceOrientations को अपनी Info.plist में जोड़ने और दो लैंडस्केप ओरिएंटेशन निर्दिष्ट करने का सुझाव देने जा रहा था। लेकिन जाहिर है, उद्धृत प्रश्न के उत्तर के अनुसार, यह पर्याप्त नहीं है।

1

इस प्रयास करें (यह काम करता है):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation { 
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 
+0

'if' स्थिति को संशोधित करें कि आप किस मोड में चाहते हैं। उपर्युक्त कोड इसे परिदृश्य में सही करता है। बाईं ओर लॉक करने के लिए 'if' चेक को UIInterfaceOrientationLandscapeLeft में बदलें। दोनों लैंडस्केप मोड के लिए, अगर (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) – Sid

+0

काम नहीं किया ... यह UISplitViewController का उपयोग नहीं करते समय पर्याप्त है। – nacho4d

+0

'UIInterfaceOrientationIsLandscape (इंटरफ़ेसऑरिएंटेशन);' ऐप्पल मैक्रो है जो आपने जल्द ही आपके उत्तर में कहा था। तो पूछने वाले ने जो किया है वह किया है। –

0

मेरा मानना ​​है कि यह एक बग है, मैं भी इस समस्या का सामना करना पड़ा।

1) एक नए iPad प्रोजेक्ट बना का उपयोग कर UISplitViewController टेम्पलेट Info.plist

Supported interface orientations 
-Landscape (left home button) 
-Landscape (right home button) 

2) संपादित करें: यह

UIInterfaceOrientationLandscapeLeft 

से कोई लेना देना इस स्थिति को दोहराने के लिए कुछ न कुछ है) DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// return YES; 
NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft); 
return interfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
} 

4) इसे चलाएं .... आपको एक खाली काला दृश्य दिखाई देगा। और कोई फर्क नहीं पड़ता कि आप कैसे बारी है। "UIInterfaceOrientationLandscapeLeft" कभी नहीं पता चला।

वैसे, nacho4d के जोड़ने BOOL जाँच काम के आसपास काम कर रहा है। अंगूठे यूपी :)

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