2009-04-08 7 views
7

मैं निम्नलिखित को लागू करना चाहता हूं। जब उपयोगकर्ता आईफोन को घुमाता है, तो मैं एक नया UIViewController (स्वचालित रूप से रोटेशन पर, बटन पर क्लिक न करने या समान कार्य करने पर) को तुरंत चालू करना चाहता हूं और उपयोगकर्ता को इस नए UIViewController द्वारा परिदृश्य अभिविन्यास में प्रबंधित दृश्य को दिखाता हूं। यह ठीक से कैसे करें?आईफोन घुमाने, और एक नया UIViewController को चालू करने?

मैंने विधियों में नए नियंत्रक को तुरंत चालू करने की कोशिश की है .RotateToInterfaceOrientation और didRotateFromInterfaceOrientation, लेकिन इनमें से कोई भी तरीका नहीं कहा जाता है! मुझे संदेह है कि ऐसा इसलिए है क्योंकि वर्तमान नियंत्रक को नेविगेशन नियंत्रक द्वारा धक्का दिया जाता है जिसे स्वयं टैबबार नियंत्रक द्वारा नियंत्रित किया जाता है। कोई सुराग? एक साधारण कोड स्निपेट की सराहना की जाएगी।

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

उत्तर

7

मैंने इस ऐप पर इस सटीक प्रकार के व्यवहार को लागू किया है और कुंजी यह सुनिश्चित करने के लिए है कि किसी भी मूल नियंत्रक को लागू करना चाहिएऑटोरोटेट टॉइंटरफेसऑरिएंटेशन और आपका वर्तमान व्यू कंट्रोलर भी इसे लागू करता है। मेरे मामले में मैं एक टैब नियंत्रक का उपयोग कर रहा हूं जो कॉल को ऑटोरोटेट टॉइंटरफेसऑरिएंटेशन में हस्तक्षेप करता है और कॉल को गिरने के लिए मुझे टैब नियंत्रक को ओवरराइड करना पड़ा। दृश्य नियंत्रकों का डिफ़ॉल्ट व्यवहार केवल पोर्ट्रेट मोड में प्रदर्शित करना है।

तो तुम सब उन्मुखीकरण के माध्यम से परिवर्तन की अनुमति के लिए बाध्य करने की जरूरत है: - (bool) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { वापसी हाँ; }

फिर आदेश कोई नया दृश्य नियंत्रक आप को जवाब देना चाहिए लोड करने के लिए:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    if((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || 
    (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) 
    {  
    // Load the view controller you want to display in landscape mode... 
    } 
} 

और भी उपयोग कर सकते हैं:

-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

पता लगाने के लिए कि उन्मुखीकरण परिवर्तन आ रहा है।

मेरे मामले में मैं अगर पिछले अभिविन्यास पोर्ट्रेट था और यदि ऐसा दृश्य लोड मैं परिदृश्य मोड में प्रदर्शित करना चाहते हैं की जाँच करने के didRotateFromInterfaceOrientation उपयोग कर रहा हूँ।

मैं तो ViewController मैं लोड हो रहा हूँ में एक ही तरीके से लागू किया है और यह पता लगाने जब अभिविन्यास पोर्ट्रेट वापस करने के लिए बदल जाता है और देखने ढेर से खुद को नकारने के लिए जिम्मेदार है।

आशा है कि थोड़ा सा मदद करता है।

पॉल

+0

क्या मुझे प्रारंभिक टैबबारकंट्रोलर को subAass करना चाहिए ताकि इसमेंAAutorotateToInterfaceOrientation विधि को जोड़ा जा सके? यह टैबबार नियंत्रक आईबी और कुछ लाइनों को एप्लिकेशन प्रतिनिधि में एक कोड का उपयोग करके स्थापित किया गया है। मैंने सभी चरणों का पालन किया है, लेकिन किया गया RotateFromInterfaceOrientation नहीं कहा जाता है। –

+1

ठीक है, मैंने tabBarController को उपclassed, addAutorotateToInterfaceOrientation जोड़ना और अब सबकुछ काम करता है। आपकी मदद के लिए बहुत बहुत शुक्रिया। सधन्यवाद। –

+0

मैं UITabBarController का उपयोग नहीं करना पसंद करता हूं और इसके बजाय UITiewController को UITabBar के साथ उपयोग करना पसंद करता हूं। – mk12

1

क्या आप चाहिएऑटोरोटेट टूइंटरफेसऑरिएंटेशन? यदि नहीं, तो हो सकता है कि आपको संदेश क्यों नहीं मिल रहे हैं।

+0

हाँ मैं करता हूँ। यहां तक ​​कि केवल यूईएस को वापस करने के लिए चाहिएऑटोरोटेट टॉइंटरफेसऑरिएंटेशन काम नहीं करता है। –

29

एक क्लीनर तरीका रोटेशन के लिए UIInterfaceOrientation उपयोग करने के लिए नहीं है।

क्यों, क्योंकि तब आपकी इंटरफ़ेस या दृश्य 1 वास्तव में घूमता है। इसका मतलब है आप इसे वापस बारी बारी से करने के लिए इसे पुन: प्रदर्शित करने के लिए करने के बाद दृश्य 2 निकाल दिया जाता है की है।

इसके लिए क्षतिपूर्ति करने के लिए, मैं सरल UIDeviceOrientation अधिसूचनाओं की सदस्यता लेता हूं। काफी अलग है। देखें 1 autorotation इस विधि काम करने के लिए समर्थन करने के लिए नहीं है।

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

तो बस विधि detectOrientation को परिभाषित:

-(void) detectOrientation { 

    if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) || 
      ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)) { 

     //load view 2 


    } else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait) { 

     // load view 1 

    } 
} 

अब आप अपने विचारों का न autoratation समर्थन की जरूरत है viewDidLoad में निम्न कोड दर्ज करें! हालांकि आप एक लोड करने से पहले दृश्य 2 पर बदलना प्रदर्शन करने के लिए की आवश्यकता होगी:

-(void) transformView2ToLandscape { 

    NSInteger rotationDirection; 
    UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation]; 

    if(currentOrientation == UIDeviceOrientationLandscapeLeft){ 
    rotationDirection = 1; 
    }else { 
    rotationDirection = -1; 
    } 

    CGRect myFrame = CGRectMake(0, 0, 480, 300); 
    CGAffineTransform transform = [[self view2] transform]; 
    transform = CGAffineTransformRotate(transform, degreesToRadians(rotationDirection * 90)); 
    [[self view2] setFrame: myFrame]; 
    CGPoint center = CGPointMake(myFrame.size.height/2.0, myFrame.size.width/2.0); 
    [[self view2] setTransform: transform]; 
    [[self view2] setCenter: center]; 

} 

Thats कैसे मैं अपने विचारों में autorotation के समर्थन के बिना ओ रोटेशन विचारों स्वैप।

+1

यह वास्तव में दिलचस्प लगता है। मैं इसे वास्तविक प्रदर्शन को समझने की कोशिश करूंगा, यानी, अधिसूचना कितनी तेज़ी से वितरित की जाती है और ट्रांसफॉर्म को लागू करने में कितना लगता है। बहुत बहुत धन्यवाद। –

+0

यह बहुत अच्छी तरह से काम करता है। विशेष रूप से यदि आप दो ओरिएंटेशन के लिए दो अलग-अलग दृश्य नियंत्रकों का उपयोग कर रहे हैं। –

+0

"चेक किया गया" उत्तर प्रश्न का उत्तर देता है, लेकिन यह प्रतिक्रिया उस प्रश्न का उत्तर देती है जो (आदर्श) से पूछा जाना चाहिए था। – DBD

3

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

अपने टैब बार नियंत्रक को यह करें:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [self.selectedViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
} 
+0

धन्यवाद, मैं इसे अपने कोड में जोड़ दूंगा। –

+0

आपको UITabBarController subclassing नहीं होना चाहिए। – mk12

+0

@ एमके 12: क्यों? क्या इस तरह के छोटे ओवरराइड समस्याएं पैदा कर सकते हैं? – Kornel

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