2013-01-17 22 views
14

यदि मेरे पास UIViewController के लिए पॉइंटर है, तो क्या मुझे इंटरफ़ेस बदलते समय अधिसूचित किया जा सकता है नियंत्रक के कोड को संशोधित किए बिना ऑरेंटेशन?क्या मैं देख सकता हूं जब UIViewController इंटरफ़ेस बदलता है?

डिवाइस अभिविन्यास में परिवर्तनों का पता लगाने के लिए मेरी सबसे अच्छी शर्त है और फिर देखें कि क्या UIViewController घुमाएगा (डी)?

+0

यह सुनिश्चित नहीं है कि प्रश्न अभी भी वास्तविक है, लेकिन आप अपने स्वयं के कोड को 'UIViewController' कोड में जोड़ने के लिए objc विधि swizzling का उपयोग कर सकते हैं। यह आपके-अपने कार्यान्वयन के साथ '-didRotateFromInterfaceOrientation:' का आदान-प्रदान जैसा दिखना चाहिए, जिसमें आपके अभिविन्यास को कॉल करने के लिए हैंडलर विधि और मूल कार्यान्वयन के लिए कॉल – medvedNick

+0

@medvedNick उचित लगता है। मैं अपने प्रतिनिधि को बुला सकता हूं और फिर मूल कार्यान्वयन को बुला सकता हूं। मैं संभावित दुष्प्रभावों के बारे में थोड़ा चिंतित हो सकता हूं। –

उत्तर

16

आप NSNotificationCenter उपयोग कर सकते हैं:

[[NSNotificationCenter defaultCenter] addObserver:self // put here the view controller which has to be notified 
             selector:@selector(orientationChanged:) 
              name:@"UIDeviceOrientationDidChangeNotification" 
              object:nil]; 
- (void)orientationChanged:(NSNotification *)notification{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    //do stuff 
    NSLog(@"Orientation changed");   
} 
+3

हम्म। मुझे लगता है कि मैं स्पष्ट नहीं था। मैं डिवाइस के बजाए व्यू कंट्रोलर के स्पष्ट अभिविन्यास को जानना चाहता हूं। दूसरे शब्दों में, मेरा ऑब्जेक्ट अपने अभिविन्यास को देखने के लिए एक व्यू कंट्रोलर देखना चाहता है, जो डिवाइस से अलग हो सकता है और जब डिवाइस अभिविन्यास बदलता है तो बदल नहीं सकता है। यह उत्तर मेरे प्रश्न के दूसरे भाग में जो कुछ भी लगा रहा था उसका हिस्सा है। –

2

आप अपने UIViewController पर willAnimateRotationToInterfaceOrientation:duration: विधि का उपयोग करें और फिर लैंडस्केप या पोर्ट्रेट के लिए किसी भी UIViews (या किसी अन्य कोड) स्थान बदल सकते हैं। जैसे

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    // change positions etc of any UIViews for Landscape 
    } else { 
    // change position etc for Portait 
    } 

    // forward the rotation to any child view controllers if required 
    [self.rootViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 
+1

दुर्भाग्य से इसका मतलब UIViewController के कोड को बदलना होगा। यहां मेरे पास केवल एक सूचक है और इसके व्यवहार का निरीक्षण करना चाहता हूं। मैं वास्तव में क्या करना चाहूंगा जब "इंटरफ़ेसऑरिएंटेशन" एक अलग मूल्य देता है तो अधिसूचित किया जा सकता है। –

+0

एनबी: यह आईओएस 8 में बहिष्कृत है। Http://stackoverflow.com/questions/25238620/ios-8-rotation-methods-deprecation-backwards-compatibility – jowie

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