2009-12-11 16 views
8

मैं एक आईफोन एप्लीकेशन विकसित कर रहा हूं जिसमें कई निब्स हैं, और केवल परिदृश्य होना चाहिए।लैंडस्केप केवल कई आईबीएस के साथ आईफोन ऐप

एप्लिकेशन अपनी Info.plist फ़ाइल के माध्यम से लैंडस्केप मोड में शुरू करने के लिए सेट है।

मेरे पास दो दृश्य नियंत्रक हैं: FirstViewController और SecondViewController

इनमें से प्रत्येक के लिए मेरे पास एक निब फ़ाइल है, जहां दृश्य परिदृश्य में है। दोनों व्यू कंट्रोलर को मेरे MainView निब आउटलेट के रूप में जोड़ा जाता है, और उनके विचार आलसी शुरू होते हैं।

जब एप्लिकेशन लोड होता है, तो दृश्य दृश्य के रूप में पहला दृश्य प्रदर्शित होता है। हालांकि, जब मैं दूसरे दृश्य पर स्विच करता हूं, तो डिवाइस (या सिम्युलेटर) परिदृश्य में रहता है, लेकिन दृश्य घुमाया जाता है, जैसे कि डिवाइस पोर्ट्रेट मोड में था, मेरे इंटरफेस को तोड़ रहा था।

दोनों UIViewController कक्षाएं मैं निम्नलिखित कोड है में:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight; 
} 

और दृश्य बदलने के लिए, मेरे ऐप प्रतिनिधि में मैं कर रहा हूँ:

[viewController.view removeFromSuperview]; 
[window addSubview:secondViewController.view]; 

जहां viewController और secondViewController दो दुकानें हैं जहां दृश्य नियंत्रक जुड़े हुए हैं।

यह कैसे दूसरे दृश्य आईबी में दिखाई देता है: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

और इस यह कैसे सिम्युलेटर में दिखाई देता है: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

क्यों कि है दूसरे दृश्य परिदृश्य में प्रदर्शित कर रहा है लेकिन इंटरफेस के साथ घुमाया?

मैं रूपांतरण गुणों से निपटना नहीं चाहता, क्योंकि यह ओवरकिल लगता है।

उत्तर

3

मैंने इस सवाल को तारांकित किया कि कोई आपको एक अंतर्दृष्टिपूर्ण प्रतिक्रिया देगा और मैं कुछ सीखूंगा .. दुख की बात है कि मुझे डर है कि आपको इसे ठीक से काम करने के लिए ट्रांसफॉर्म का उपयोग करने की आवश्यकता हो सकती है। यहाँ कोड मैं समस्या को हल करने हाल ही में उपयोग करते आ रहे:

- (void)forceLandscapeForView:(UIView *)theView { 
    theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
    theView.bounds = CGRectMake(0, 0, 480, 320); 
    theView.center = CGPointMake(160, 240); 
    [theView setNeedsLayout]; 
    [theView setNeedsDisplay]; 
} 

फिर जब आप अपने नए दृश्य जोड़ रहे हैं, वर्तमान उन्मुखीकरण की जाँच करें और यदि आवश्यक हो तो बल रोटेशन:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) { 
    [self forceLandscapeForView:_activeViewController.view]; 
} 

फिर

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return UIInterfaceOrientationIsLandscape(interfaceOrientation); 
} 

मैं वैकल्पिक समाधान के बारे में जानकर बहुत खुशी होगी अगर यह सब neces नहीं है: बेशक आप आपके विचार नियंत्रकों में से प्रत्येक में shouldAutorotateToInterfaceOrientation को उचित प्रतिक्रिया चाहता हूँ sary।इस सेटअप के साथ मैंने देखा है कि एक चेतावनी भी है: यदि आपके पास विचारों के बीच एक संक्रमण है, और आप उस संक्रमण के दौरान फोन घुमाते हैं, तो दृश्य परिदृश्यों को गलत परिदृश्य अभिविन्यास पर फ़्लिप या "अटक" के लिए संभव है, जब आप विचारों के बीच नेविगेट करते हैं तो आपको फ़ोन को चालू करने की आवश्यकता होती है (लैंडस्केप-दाएं बनाम लैंडस्केप-बाएं)।

+0

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

+0

यह (पहली विधि) मेरे लिए काम किया। घंटों के लिए समाधान की तलाश में थे और मैंने पहले कुछ ऐसा करने की कोशिश की (लेकिन विचारों के भीतर लोड किया गया ...)। इसे सबव्यू के रूप में जोड़ने से पहले उपर्युक्त परिवर्तन लागू करें। – Wollan

0

यह सिर्फ एक सुझाव है लेकिन आप दूसरे दृश्य के लिए चाहिएऑटरोटेट विधि में NO को वापस करने का प्रयास नहीं कर सकते हैं। या आईबी में पोर्ट्रेट व्यू में इसे बनाने का प्रयास करें। ऐसा लगता है कि आपका विचार सही ढंग से लोड किया गया था (लैंडस्केप मोड में) लेकिन फिर ऑटोरोटेट संदेश प्राप्त किया गया था और 90 डिग्री से घूर्णन किया गया था।

+0

मैंने इसे पहले से ही कोशिश की, और काम नहीं किया। – pgb