2010-05-14 7 views
7

मेरे ऐप में लगभग 10 अलग-अलग UIViewControllers हैं, जिनमें से एक डिवाइस को घुमाए जाने पर लैंडस्केप मोड में स्विच करना चाहते हैं। (बाकी सब, मैं चित्र में रखना चाहता हूं।)अभिविन्यास परिवर्तनों के जवाब में UIViewController रोटेशन को कैसे कार्यान्वित करें?

उस दृश्य पर घूर्णन को लागू करने के लिए, मुझे इसके नियंत्रक की 'चाहिएऑटोरोटेट' विधि को लागू करने और YES वापस करने की आवश्यकता है। चूंकि इस दृश्य को नेविगेशन नियंत्रक के माध्यम से एक्सेस किया गया है, इसलिए मुझे UINavigationController का उप-वर्ग बनाने की भी आवश्यकता है जो 'mustAutorotate' लागू करता है और YES को वापस करता है।

यह समाधान काम करता है, लेकिन बहुत अच्छा है। मुझे लगता है कि UINiewControllers के मेरे सबक्लास पर धक्का देने वाले सभी UIViewControllers रोटेशन का जवाब देते हैं, भले ही मैं 'mustAutorotate' को लागू करता हूं और वापस नहीं करता हूं। (याद रखें: मैं केवल एक विशेष UIViewController को रोटेशन का जवाब देना चाहता हूं, न कि नेविगेशन नियंत्रक के ढेर में हर कोई।)

तो, मेरा सवाल है: मैं यह कैसे कर सकता हूं? सभी समाधान जो मैं आ सकता हूं 1) बोझिल, और 2) बदतर, काम नहीं लग रहा है।

बहुत बहुत धन्यवाद।

उत्तर

0

मैंने उदाहरण के रूप में उदाहरण देखे हैं कि आप इसे कर रहे हैं लेकिन इसे ठीक से काम नहीं कर पाए। मुझे एप्पल उदाहरणों से ऐसा करने का बेहतर तरीका मिला। असल में आप एक मौजूदा मॉड्यूल व्यू कंट्रोलर को कार्यान्वित करते हैं और एक और दृश्य बनाते हैं। UIKit दृश्य के बीच एक मूल रोटेशन एनीमेशन और fades करता है। आपको घुमावदार दृश्य को एक प्रतिनिधि वर्ग के रूप में कार्यान्वित करना होगा ताकि वह इसे कॉल करने के लिए कॉलिंग क्लास पर वापस कॉल कर सके और अभिविन्यास अपडेट कर सके।

- (void)orientationChanged:(NSNotification *)notification 
{ 
    // We must add a delay here, otherwise we'll swap in the new view 
    // too quickly and we'll get an animation glitch 
    NSLog(@"orientationChanged"); 
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0]; 
} 

और फिर एक परिदृश्य स्क्रीन प्रदर्शित करने के लिए:

- (void)updateLandscapeView 
{ 
PortraitView *portraitView = [[PortraitView alloc] init]; 
portraitView.delegate = self; 
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
if (UIDeviceOrientationIsLandscape(deviceOrientation) && !isShowingLandscapeView) 
{ 
    [self presentModalViewController: portraitView animated:YES]; 
    isShowingLandscapeView = YES; 
    } 
else if (deviceOrientation == UIDeviceOrientationPortrait && isShowingLandscapeView) 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
    isShowingLandscapeView = NO; 
    } 
[portraitView release]; 
} 
1

मैं यह करने के लिए एक रूट दृश्य नियंत्रक होने से (यह एक UITabBarController हो सकता है) और यह viewDidLoad विधि मैं रोटेशन ईवेंट की सदस्यता है में:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didRotate:) 
                 name:@"UIDeviceOrientationDidChangeNotification" 
                 object:nil]; 
didRotate में

तब: विधि मैं देखो, जिस पर देखने नियंत्रक दिख रहा है जब रोटेशन हुआ है, और क्या उन्मुखीकरण फोन में है:

- (void) didRotate:(NSNotification *)notification { 
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

/* 
    DEVICE JUST ROTATED TO PORTRAIT MODE 

orientation == UIDeviceOrientationFaceUp || 
orientation == UIDeviceOrientationFaceDown 

*/ 
if(orientation == UIDeviceOrientationPortrait) { 





/* 
    DEVICE JUST ROTATED TO LANDSCAPE MODE 
*/ 
}else if(orientation == UIInterfaceOrientationLandscapeLeft || 
     orientation == UIInterfaceOrientationLandscapeRight) { 






} 

} 

उस के भीतर किया गया थारोटेट: आप देख सकते हैं कि दृश्यमान नियंत्रक कौन सा है और आप वहां से क्या चाहते हैं।

जब मैं एक विशेष दृश्य नियंत्रक दिखाई देता है और फोन परिदृश्य में घुमाया जाता है तो मैं लैंडस्केप मोड में एक मोडल व्यू कंट्रोलर प्रस्तुत करता हूं। यदि कोई अन्य दृश्य नियंत्रक दिखाई देता है, तो मैं ईवेंट को अनदेखा करता हूं।

मैं अपने मोडल व्यू कंट्रोलर को अपने दृश्य में लैंडस्केप मोड में प्रदर्शित करने के लिए मजबूर करता हूं WillAppear विधि - अगर मैं इसे चाहता हूं तो मैं किसी को यह कोड दे सकता हूं।

उम्मीद है कि इससे मदद मिलती है।

डेव

1

रिटर्न हाँ नेविगेशन नियंत्रक उपवर्ग पर केवल तभी [[navController topViewController] isKindOfClass: [RotatingViewController वर्ग]]

2

जब आप UINavigationController लागू, इस वर्ग के अपने माता पिता है कि नियंत्रित करता है सभी बच्चे देखें नियंत्रक जिन्हें ढेर में धकेल दिया जाएगा।इसलिए, रूटव्यू कंट्रोलर एकमात्र नियंत्रक है जो ऑटोरोटेशन के लिए हाँ या नहीं कहता है। भले ही, आप बच्चों में ऑटो-रोटेशन के लिए हां पास कर रहे हैं नियंत्रकों को देखते हैं, वे गिनती नहीं करते हैं!

यह यूनाविगेशन नियंत्रक की प्रकृति है। तो इसे बदलने के लिए, आपके पास दो विकल्प हैं:

1- मैन्युअल रूप से इसका उपयोग करें, जिसके लिए आपको कुछ बोझिल कोडों के माध्यम से जाना होगा।

2- अपना डिज़ाइन बदलें ताकि यह UINavigationController के लिए अधिक अनुकूल हो। उस एकल दृश्य को घुमाया जाना चाहिए, रूटव्यू कंट्रोलर द्वारा नहीं जाना चाहिए (नेविगेशन रूट व्यू कंट्रोलर नहीं - उन्हें समान नाम दिया गया है, लेकिन पूरी तरह से अलग हैं), दृश्य जो NavController होस्ट करता है। और जब डिवाइस घूमता है, तो यह या तो NavController को दृश्य या दूसरे पर धक्का देगा।

3- दूसरी विधि, जो भी काम करेगी, लेकिन इसकी सिफारिश नहीं की जाती है क्योंकि यह एमवीसी की अवधारणा का उल्लंघन करता है, यह है कि आपका NavController अधिसूचनाओं को सुन सकता है। वह विशेष बच्चा दृश्य जो घुमा सकता है और घुमा सकता है अधिसूचना - उदाहरण के लिए घुमाएं, और एक बार NavController इसे सुनता है, यह घूमता है।

जैसा कि मैंने कहा, यह काम करेगा, लेकिन यह एमवीसी मॉडल का उल्लंघन करता है - जो ऐप्पल के लिए ठीक है, लेकिन प्रोग्रामिंग परिप्रेक्ष्य से अनुशंसित नहीं है।

यदि आपको इनमें से किसी के बारे में और स्पष्टीकरण की आवश्यकता है, तो कृपया मुझे बताएं।

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