लैंडस्केप मोड, 2008 सिस्टम में iPhone ऐप


98

कृपया ध्यान दें कि यह प्रश्न 2008 का है और अब केवल ऐतिहासिक हित का है।


आईफोन एप्लिकेशन बनाने का सबसे अच्छा तरीका क्या है जो डिवाइस की स्थिति की परवाह किए बिना, शुरुआत से लैंडस्केप मोड में चलता है?

दोनों प्रोग्रामर और इंटरफ़ेस बिल्डर का उपयोग कर।


5
किसी भी भविष्य के पाठकों के लिए, कृपया ध्यान दें कि यह प्रसिद्ध समस्या अब 2011 तक Apple द्वारा हल की गई है । नीचे दिए गए उत्तर में परीक्षण परियोजना पर ध्यान दें।
फटी

जवाबों:


47

केवल ऐतिहासिक उत्तर। असाधारण रूप से पुराना है।

कृपया ध्यान दें कि यह उत्तर अब बेहद पुराना है /

यह उत्तर केवल एक ऐतिहासिक जिज्ञासा है


उत्तेजित समाचार! जैसा कि नीचे एंड्रयू ने खोजा है, यह समस्या Apple द्वारा 4.0+ में तय की गई है।

ऐसा प्रतीत होता है कि प्रत्येक दृश्य पर दृश्य के आकार को बाध्य करने के लिए यह कोई आवश्यक नहीं है, और परिदृश्य की विशिष्ट गंभीर समस्या "केवल पहली बार काम कर रही" का समाधान किया गया है।

अप्रैल 2011 तक, 4.0 के नीचे कुछ भी परीक्षण या निर्माण करना संभव नहीं है, इसलिए सवाल विशुद्ध रूप से एक ऐतिहासिक जिज्ञासा है। यह अविश्वसनीय है कि यह इतने लंबे समय के लिए डेवलपर्स को कितना परेशान करता है!


यहाँ मूल चर्चा और समाधान है। यह अब पूरी तरह से अप्रासंगिक है, क्योंकि ये सिस्टम भी संचालित नहीं हैं।


इस काम को पूरी तरह से करने के लिए यह बहुत मुश्किल है - खेलने में कम से कम तीन समस्याएं / कीड़े हैं।

इस कोशिश करो .. इंटरफ़ेस बिल्डर परिदृश्य डिजाइन

विशेष रूप से ध्यान दें कि जहां यह कहता है "और आपको हर जगह" आउटरोटेटटेटोइंटरफेस ऑप्रेशन को ठीक से "उपयोग करने की आवश्यकता है" इसका अर्थ है हर जगह, आपके सभी फुलस्क्रीन विचार।

आशा है कि यह इस दुःस्वप्न में मदद करता है!

हाथ में ADDITIONAL प्रसिद्ध समस्या का एक महत्वपूर्ण अनुस्मारक: यदि आप अधिक एक दृश्य (सभी परिदृश्य) के बीच स्वैप करने की कोशिश कर रहे हैं , तो यह पूरी तरह से काम नहीं करता है । यह याद रखना आवश्यक है या आप समस्या पर दिन बर्बाद करेंगे। यह सचमुच नहीं है। यह आईओएस प्लेटफॉर्म पर सबसे बड़ा खुला, ज्ञात, बग है। शाब्दिक रूप से हार्डवेयर को आपके द्वारा लोड किए जाने वाले दूसरे दृश्य को परिदृश्य बनाने का कोई तरीका नहीं है। कष्टप्रद लेकिन सरल वर्कअराउंड, और आपको क्या करना चाहिए, एक तुच्छ मास्टर UIViewController है जो कुछ भी नहीं करता है लेकिन वहां बैठते हैं और आपको अपने विचारों के बीच स्वैप करते हैं।

दूसरे शब्दों में, iOS में एक प्रमुख पता बग के कारण:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

आप केवल एक बार ही ऐसा कर सकते हैं । बाद में, यदि आप happyThing.view को निकालने का प्रयास करते हैं, और इसके बजाय newThing.view में डालते हैं, तो यह काम नहीं करता - और यह नहीं है। मशीन दृश्य को कभी भी परिदृश्य में नहीं घुमाएगी। कोई चाल ठीक नहीं है, यहां तक ​​कि ऐप्पल भी इसे काम नहीं कर सकता है। आपके द्वारा अपनाई जाने वाली वर्कअराउंड एक समग्र UIViewController है जो बस वहां बैठती है और आपके विभिन्न विचारों (हैप्पीहिंग, न्यूटहिंग, आदि) को रखती है। आशा करता हूँ की ये काम करेगा!


2
मेरा मानना ​​है कि यह 4.x में तय किया गया है। हमने एक गेम भेजा जिसमें विभिन्न स्क्रीन, कुछ परिदृश्य और कुछ पोर्ट्रेट का एक गुच्छा था, और यह सिर्फ 3.x में काम नहीं करता था। इसे संभालने के लिए अतिरिक्त डमी दृश्य में नहीं आना चाहते, हमें इसके बजाय 4.x की आवश्यकता थी - जो, इस प्रश्न के पूछे जाने के एक साल बाद, शायद ठीक है।
एंड्रयूज

हमने "हमेशा परिदृश्य" नहीं किया, बल्कि विभिन्न परिदृश्य या चित्र बनाए। प्रत्येक वीसी को सीधे खिड़की से जोड़ा और हटाया जाता है। ऐप लैंडस्केप लॉन्च करता है, कई स्क्रीन संक्रमण के माध्यम से इस तरह से रहता है। हम एक डमी दृश्य का उपयोग नहीं करते हैं, लेकिन हम हर स्क्रीन में अलग होना चाहिए। 4.x पर कोई समस्या नहीं, टच से पैड तक फोन।
एंड्रयूज

41

Apple देव साइट से:

लैंडस्केप मोड में अपना आवेदन शुरू करने के लिए ताकि स्टेटस बार तुरंत उपयुक्त स्थिति में हो, उपयुक्त मूल्य (UIInterfaceOrientationLandscapeight या UIInterfaceOrientationLandscapeLeft) के साथ UIInterfaceOrientation कुंजी जोड़ने के लिए अपनी Info.plist फ़ाइल को संपादित करें, जैसा कि लिस्टिंग 2 में दिखाया गया है।

लिस्टिंग 2: लैंडस्केप मोड में अपना एप्लिकेशन शुरू करें

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

5
आपके plusAutorotateToInterfaceOrientation मेथड में यह वापसी (interfaceOrientation! = UIInterfaceOrientationPortrait); और आपने कल लिया।
माइकल बेहान

5
प्रश्न पूछता है कि डिवाइस को लैंडस्केप मोड में कैसे शुरू किया जाए। जवाब वह जानकारी देता है। उसके बाद अभिविन्यास संभालना प्रश्न में उल्लेख नहीं किया गया है। +1 माइकल
प्राइर

1
वास्तव में, "उत्तर" वास्तव में डिवाइस को लैंडस्केप मोड में शुरू नहीं करेगा - !! यह शायद Apple वातावरण में सभी में सबसे प्रसिद्ध बग / कठिनाई है। यह बहुत ही काम कर रहे iPad डेवलपर के लिए एक बुनियादी है!
फेटी

@mbehan UIInterfaceOrientationPortraitUpsideDown भी है, इसलिए फिक्स नहीं है। इसके अतिरिक्त, UIInterfaceOrientation in .plist केवल 3.2+ पर समर्थित है, 3.1.3 और पुराने डिवाइस पर नहीं (और याद रखें कि iPhone 2G उस संस्करण पर अटका हुआ है)।
इवान वूसिका

28

सभी पदों से सारांश और एकीकरण, इसे स्वयं परीक्षण करने के बाद; नीचे 4.x, 5.x के लिए अद्यतन की जाँच करें।

3.2 के रूप में आप कोड से किसी रनिंग एप्लिकेशन के ओरिएंटेशन को नहीं बदल सकते।

लेकिन आप एक निश्चित अभिविन्यास के साथ एक आवेदन शुरू कर सकते हैं, हालांकि ऐसा करना सीधा नहीं है।

इस नुस्खे के साथ आजमाएं:

  1. फ़ाइल UISupportedInterfaceOrientationsमें अपना ओरिएंटेशन सेट करेंInfo.plist
  2. अपनी विंडो में 480x320 "बेस व्यू कंट्रोलर" को परिभाषित करें। हर दूसरे दृश्य को इसके दृश्य के लिए एक सबव्यू के रूप में जोड़ा जाएगा।
  3. सभी दृश्य नियंत्रकों में shouldAutorotateToInterfaceOrientation:विधि निर्धारित की जाती है (उसी मूल्य को लौटाने के लिए जिसे आप निश्चित रूप से प्लिस्ट में परिभाषित करते हैं)
  4. सभी दृश्य नियंत्रकों के साथ एक पृष्ठभूमि दृश्य सेट करें

    self.view.frame = CGRectMake(0, 0, 480, 320)

    में viewDidLoadविधि।

अपडेट (iOS 4.x, 5.x) : Apple iOS ऐप प्रोग्रामिंग गाइड में "एडवांस ऐप ट्रिक्स" अध्याय में "लैंडस्केप मोड में लॉन्चिंग" पैराग्राफ है।

संदर्भ:


1
मैं पुष्टि कर सकता हूं कि यह एकमात्र, सही मायने में काम करने वाला समाधान (एक छोटे से जोड़ के साथ) है। इसे खोजने और उसका मूल्यांकन करने में मुझे घंटों लग गए। अन्य सभी उत्तर समस्या का केवल आंशिक समाधान हैं।
जोहान्स रूडोल्फ

8

पहले मैंने info.plist में सेट किया

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

फिर मैंने इस कोड को ApplicationDidFinishLaunching में डाला:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

इस तरह मैं परिदृश्य मोड में इंटरफ़ेस बिल्डर में दृश्य पर काम कर सकता हूं।


7

sasb और michaelpryor का उत्तर सही प्रतीत होता है, लेकिन यदि यह आपके लिए काम नहीं कर रहा है, तो इस विकल्प को आज़माएँ:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

या यह एक:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

या यह एक:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

आपको window makeKeyAndVisible;पहले कॉल भी करना पड़ सकता है ।

कुछ लिंक: लैंडस्केप मोड में विकसित करना , iPhone एसडीके: लैंडस्केप मोड को केवल कैसे मजबूर करें?

@ रॉबर्ट: कृपया iPhone एसडीके, एनडीए और स्टैक ओवरफ़्लो देखें


6

मुझे आश्चर्य है कि कोई भी अभी तक इस जवाब के साथ नहीं आया है:

मेरे सभी परीक्षणों में जब एक मोडल व्यू कंट्रोलर को खारिज कर दिया जाता है, तो पेरेंट व्यू कंट्रोलर का पसंदीदा ओरिएंटेशन सेट होता है shouldAutorotateToInterfaceOrientation जाता है, तब भी जब UINavigationController का हिस्सा होता है। तो इसका समाधान सरल है:

पृष्ठभूमि के लिए UIImageView के साथ एक डमी UIViewController बनाएं। अपने ऐप में स्टार्टअप पर उपयोग की जाने वाली छवि को डिफ़ॉल्ट पर सेट करें।

जब viewWillAppearआपके रूट व्यू कंट्रोलर में कॉल किया जाता है, तो एनीमेशन के बिना डमी व्यू कंट्रोलर को प्रस्तुत करें।

जब viewDidAppearआपके डमी व्यू कंट्रोलर को कॉल किया जाता है, तो व्यू कंट्रोलर को एक अच्छे क्रॉस विघटित एनीमेशन के साथ खारिज करें।

न केवल यह काम करता है, लेकिन यह अच्छा लग रहा है! BTW, सिर्फ स्पष्टीकरण के लिए मैं viewWillAppearइस तरह से रूट व्यू कंट्रोलर करता हूं :

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

5

नवीनतम iPhone OS प्रोग्रामिंग गाइड में इस पर एक पूर्ण खंड है, जिसमें नमूना कोड है। मुझे यकीन है कि यह एक हालिया जोड़ है, इसलिए शायद आपने इसे याद किया। यह उन सभी स्थितियों की व्याख्या करता है जिनका आपको पालन करना है; मूल रूप से ...

  • Info.plist गुण सेट करें (यह स्थिति बार की स्थिति बदलता है, लेकिन दृश्य नहीं)
  • अपने केंद्र के चारों ओर अपने दृश्य को मैन्युअल रूप से घुमाएं, या तो आपके UIViewController viewDidLoad पर: विधि या आपका एप्लिकेशनडीडिफिशलॉन्चिंग: विधि या ऑटो रोटेशन को लागू करना ("व्यवहार को ऑटिज़ करना", पृष्ठ 124)

"लैंडस्केप मोड में लॉन्चिंग" के लिए देखें, पृष्ठ 102।


4

यह उत्तर देखें: लैंडस्केप मोड केवल iPhone या iPad के लिए

  1. plist में ओरिएंटेशन जोड़ें
  2. सभी फ़ाइलों में aAutorotateToInterfaceOrientation = YES होना चाहिए

यद्यपि यदि आप मिश्रित मोड का उपयोग कर रहे हैं, तो आप के साथ बेहतर हो सकता है

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.