2014-09-25 11 views
14

दोनों में काम करता है जो अर्द्ध पारदर्शी दृश्य नियंत्रक प्रस्तुत करता है मेरे पास निम्नलिखित कोड था जो आईओएस 7 में पूरी तरह से काम करता था।आईएसओ 7 और आईओएस 8

[UIView animateWithDuration:0.5 animations:^(void) { 
    self.view.alpha = 0.5; 
    [self.navigationController.navigationBar setAlpha:0.3]; 

}]; //to make the background view controller semi-transparent 
UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; 
[rootViewController setModalPresentationStyle:UIModalPresentationCurrentContext]; 
OverlayViewController *ctlr = [storyBoard instantiateViewControllerWithIdentifier:@"OverlayViewController"]; 
//present the OverlayViewController 
[self presentViewController:ctlr animated:YES completion:nil]; 

तो मैं पृष्ठभूमि दृश्य नियंत्रक के viewWillAppear में निम्नलिखित था, पूर्ण अपारदर्शी करने के लिए अपने दृश्य वापस लौटने के लिए।

[UIView animateWithDuration:1.0 animations:^(void) { 
    self.view.alpha = 1.0; 
    [self.navigationController.view setAlpha:1.0]; 
}]; 

अब, आईओएस 8 के साथ, उपर्युक्त कोड पृष्ठभूमि को सेमी-पारदर्शी होने के लिए सेट नहीं करता है। ब्लैक रंग ओवरले व्यू कंट्रोलर से घिरा हुआ है।

मुझे ऑनलाइन मिला कि UIModalPresentationOverCurrentContext का उपयोग अपेक्षित व्यवहार देगा। यह वास्तव में करता है, लेकिन पृष्ठभूमि दृश्य नियंत्रक को दृश्य पदानुक्रम से कभी नहीं हटाया जाता है (इस व्यवहार के संदर्भ में संपादित करने के लिए संपादित: https://developer.apple.com/documentation/uikit/uimodalpresentationstyle)। तो, viewWillAppear कभी नहीं कहा जाता है, और इसलिए अर्द्ध पारदर्शिता कभी नहीं हटाई जाती है।

जाहिर है, मैं NSNotificationCenter का उपयोग करने जैसे हैक्स का सहारा ले सकता हूं और OverlayViewController को हटाए जाने पर अधिसूचना को बंद कर सकता हूं, लेकिन यह सरल होने के लिए एक चौराहे के तरीके की तरह लगता है। क्या कोई अन्य तरीका है जिसमें मैं इसे प्राप्त कर सकता हूं?

उपप्रमेय सवाल:

1) यदि UIModalPresentationOverCurrentContext एक ही तरीका है इस लक्ष्य को हासिल करने के लिए है, तो मैं सोच रहा हूँ अगर मैं कोड के दो संस्करणों डाल करने के लिए मजबूर किया जाएगा यह iOS7 और iOS8 में दोनों काम कर पाने के।

2) जाहिर है कि एक्सकोड के पुराने संस्करणों में नया enum पहचाना नहीं गया है। तो, क्या मेरी टीम को यह सुनिश्चित करने के लिए एक्सकोड 6 में अपग्रेड करना चाहिए कि वे इस कोड को चला सकें, भले ही उनका बाकी काम केवल आईओएस 7 के आसपास केंद्रित हो? या क्या आईओएस 8 के लिए आवश्यक विशेष कोड ब्लॉक को अनदेखा करने के लिए एक्सकोड के पुराने संस्करण को बताने का कोई तरीका है?

उत्तर

36

आपको आईओएस 7 और आईओएस 8 के लिए दो कॉन्फ़िगरेशन को संभालना होगा। दोनों स्थितियों में आपको यह सुनिश्चित करने की आवश्यकता है कि पृष्ठभूमि दृश्य नियंत्रक दृश्य पदानुक्रम से नहीं लिया गया है।

  1. iOS7 पर पेश दृश्य नियंत्रक के लिए UIModalPresentationCurrentContext करने के लिए modalPresentationStyle ध्वज की स्थापना द्वारा: इस के साथ पूरा किया जा सकता है। आपको यह पहचानने की आवश्यकता है कि प्रस्तुत करने वाला दृश्य नियंत्रक कौन है: यदि आपके पास एकाधिक कंटेनर व्यू नियंत्रक हैं तो यह आवश्यक नहीं है self.navigationController

  2. iOS8 पर के लिए UIModalPresentationOverCurrentContext को modalPresentationStyle ध्वज की स्थापना द्वारा प्रस्तुत दृश्य नियंत्रक। यदि आप स्टोरीबोर्ड का उपयोग कर रहे हैं तो सुनिश्चित करें कि प्रस्तुति शैली स्टोरीबोर्ड सेग्यू के लिए डिफ़ॉल्ट पर सेट की गई है और prepareForSegue विधि में प्रस्तुति शैली गंतव्य दृश्य नियंत्रक को UIModalPresentationOverCurrentContext पर सेट करें।

अब जवाब देने के लिए अपने परिणाम सवाल:

संस्करण संख्या आवेदन चल रहा है की जाँच करने के लिए कुछ मैक्रो को परिभाषित करें:

1) आप iOS7 और iOS8 पर दोनों स्थिति से निपटने के कोड की आवश्यकता पर।उदाहरण के लिए, निम्न करेगा:।

#define SYSTEM_VERSION_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame) 
#define SYSTEM_VERSION_GREATER_THAN(v)    ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending) 
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 
#define SYSTEM_VERSION_LESS_THAN(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) 
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending) 

2) जाहिर है अगर आप कोड पर iOS7 और iOS8 अतः अपनी टीम XCode के नवीनतम संस्करण "अब तक XCode 6.1 अपडेट किया जाना आवश्यक संकलित किए जाने की आवश्यकता है

+0

धन्यवाद। अच्छी तरह से समझाया! हमने यहां वर्णित कुछ के समान कुछ किया है। दुर्भाग्यवश, मेरे पास आपके उत्तर को ऊपर उठाने के लिए पर्याप्त प्रतिष्ठा नहीं है। – Shankar

+0

"सुनिश्चित करें कि प्रस्तुति शैली स्टोरीबोर्ड सेग्यू के लिए डिफ़ॉल्ट पर सेट है" - धन्यवाद, यह मेरे लिए काम कर रहा है। –

1

@ Tiguero के जवाब के आधार पर, मैं समस्या को हल करने के लिए एक छोटा सा वर्ग वर्ग बनाया।

@implementation UIViewController (Extensions) 

- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion 
{ 
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) { 
     self.parentViewController.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext; 
    }else{ 
     viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext; 
    } 

    [self presentViewController:viewControllerToPresent animated:YES completion:completion]; 
} 

@end 

iOS7 संस्करण मुझे आवश्यक नियंत्रक कि पेश करता है हार्डकोड करने।

4

आईओएस 8.x के लिए स्विफ्ट में:

UIModalPresentationStyle.OverCurrentContext की स्थापना ViewController को प्रस्तुत किया जा रहा काम करता है।

func presentTransparentController(){ 
     var viewController = self.storyboard?.instantiateViewControllerWithIdentifier("ViewControllerNamed") as! ViewController 

     // set to .OverCurrentContext 
     viewController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

     // presents the view controller as usual 
     self.presentViewController(viewController, animated: true, completion: nil) 
    } 
+1

आपको बहुत धन्यवाद प्रिय मार्को, आप मेरा दिन बचाओ –

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