पारदर्शी दृश्य बनाने के लिए presentModalViewController का उपयोग कैसे करें


80

मैं एक विहंगम दृश्य प्रदर्शित कर रहा हूं

[self presentModalViewController:controller animated:YES];

जब दृश्य स्क्रीन को ऊपर ले जाता है तो यह xib फ़ाइल में सेटिंग के अनुसार पारदर्शी होता है जिससे इसे बनाया जाता है, लेकिन एक बार स्क्रीन को भर देने के बाद यह अपारदर्शी हो जाता है।

क्या दृश्य को पारदर्शी बनाए रखने की कोई संभावना है?

मुझे संदेह है कि इसे जिस दृश्य के ऊपर रखा जा रहा है, उसके बजाय इसका प्रतिपादन नहीं किया जा रहा है, ताकि मोडल दृश्य अपारदर्शी हो रहा है।


1
यह सवाल अब बहुत पुराना है। जब जवाब की तलाश होती है, तो उस iOS के संस्करण पर लागू होता है, जिसका आप उपयोग करते हैं।
डेरिल ब्रैटन

यह stackoverflow.com/q/27598846/1603234 मुझे मुस्कुरा कर, अब आपकी बारी :)
हेमंग

आप का उपयोग कर सकते हैंviewcontroller.modalPresentationStyle = .FormSheet
जेराल्ड

जवाबों:


63

आपका दृश्य अभी भी पारदर्शी है, लेकिन एक बार जब आपका मोडल कंट्रोलर स्टैक के शीर्ष पर होता है, तो उसके पीछे का दृश्य छिपा होता है (जैसा कि किसी भी टॉप-मोस्ट व्यू कंट्रोलर के साथ होता है)। इसका समाधान यह है कि आप स्वयं एक दृश्य को चेतन करें; इसके बाद पीछे का व्यू-कॉन्ट्रोलर छिपाया नहीं जाएगा (क्योंकि आपके पास इसे 'लेफ्ट' नहीं होगा)।


धन्यवाद, यह पुष्टि करता है कि मुझे क्या संदेह था।
डारिएल ब्राटन

1
मैंने इस मुद्दे के बारे में Apple के साथ एक बग रिपोर्ट दायर की है। खुला राडार: Openradar.appspot.com/radar?id=1062402
सिद्धांत

4
इस समस्या के साथ प्रस्तुत दृश्य की अपनी ऑटोरोटेशन सेटिंग्स नहीं हो सकती हैं।
शिज़ाम

85

IOS 3.2 के बाद बिना किसी "ट्रिक्स" के ऐसा करने का एक तरीका है - modalPresentationStyle संपत्ति के लिए प्रलेखन देखें । आपके पास एक rootViewController है जो viewController पेश करेगा। तो यहाँ सफलता के लिए कोड है:

viewController.view.backgroundColor = [UIColor clearColor];
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[rootViewController presentModalViewController:viewController animated:YES];

इस विधि के साथ viewController की पृष्ठभूमि पारदर्शी होगी और अंतर्निहित rootViewController दिखाई देगा। कृपया ध्यान दें कि यह केवल iPad पर काम करने के लिए लगता है, नीचे टिप्पणी देखें।


1
हाय .. मेरी ओर से +1 bcoz यह iOS 4 और iPad में ठीक काम करता है। लेकिन यह iPhone 3.0 में कैसे काम करेगा। धन्यवाद
मितेश खत्री

3
यह मेरे लिए काम नहीं कर रहा है (iOS 5.0), क्या कोई कोड दिखा सकता है?
डैनियल

6
यह iPhone / iPod पर काम करने के लिए प्रकट नहीं होता है, केवल iPad (उत्तर में लिंक किए गए दस्तावेज़ देखें)। @simplebus: शायद यही कारण है कि यह आपके लिए काम नहीं कर रहा है?
Mac

1
FYI करें: मैंने इस पोस्ट में एक ही सवाल पूछा है: stackoverflow.com/questions/14419395/…
The Crazy Chimp

1
मैंने iOS 8 पर परीक्षण किया, और मुझे Over Current Contextप्रस्तुति शैली के रूप में उपयोग करना है।
24

48

यह काम करने के लिए मुझे क्या चाहिए:

self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;

1
यह सरल काम करता है, धन्यवाद, मैंने सिर्फ अपना कोड ऑन रखा - (BOOL) एप्लीकेशन: (UIApplication *) एप्लीकेशन ने किया ।FinishLaunchingWithOptions: (NS ढलान *) लॉन्च विधि और
आवाज

2
आप बस modalPresentationStyleप्रस्तुत दृश्य नियंत्रक (विंडो के बजाय rootViewController) पर सेट कर सकते हैं ।
मेबना

धन्यवाद!! यहां तक ​​कि जब आप काम करते हैं, तो [आत्म-प्रदर्शनसुविधाविज्ञानी: @ "खुला" प्रेषक: स्व];
डॉग कॉफ़ी

आप हमेशा मोडल के viewdidload में हाथ से दृश्य को चेतन कर सकते हैं।
जैकब के

2
ध्यान दें कि, जैसा कि नीचे श्री टी ने कहा था, modalPresentationStyle को उस दृश्य नियंत्रक पर सेट करना होगा, जिसमें वर्तमान में पूर्ण स्क्रीन है।
जेसपिन्हो

24

उन लोगों के लिए जो कुछ कोड देखना चाहते हैं, यहाँ मैंने अपने पारदर्शी दृश्य नियंत्रक में क्या जोड़ा:

// Add this view to superview, and slide it in from the bottom
- (void)presentWithSuperview:(UIView *)superview {
    // Set initial location at bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, superview.bounds.size.height);
    self.view.frame = frame;
    [superview addSubview:self.view];            

    // Animate to new location
    [UIView beginAnimations:@"presentWithSuperview" context:nil];
    frame.origin = CGPointZero;
    self.view.frame = frame;
    [UIView commitAnimations];
}

// Method called when removeFromSuperviewWithAnimation's animation completes
- (void)animationDidStop:(NSString *)animationID
                finished:(NSNumber *)finished
                 context:(void *)context {
    if ([animationID isEqualToString:@"removeFromSuperviewWithAnimation"]) {
        [self.view removeFromSuperview];
    }
}

// Slide this view to bottom of superview, then remove from superview
- (void)removeFromSuperviewWithAnimation {
    [UIView beginAnimations:@"removeFromSuperviewWithAnimation" context:nil];

    // Set delegate and selector to remove from superview when animation completes
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    // Move this view to bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, self.view.superview.bounds.size.height);
    self.view.frame = frame;

    [UIView commitAnimations];    
}

इस समस्या का एकमात्र समाधान मेरे पास स्मृति प्रबंधन है। उदाहरण के लिए: TestViewController * testView = [[TestViewController आवंटित] initWithNibName: @ "TestView" बंडल: nil]; [testView presentWithSuperview: self.navigationController.view]; ठीक काम करेगा, हालांकि यदि आप व्यू को रिलीज़ या ऑटोरिलिज़ करने का प्रयास करते हैं, तो उस दृश्य के तरीकों के लिए कोई भी कॉल, जिसके परिणामस्वरूप खराब पहुंच अपवाद होंगे
मिक वॉकर

क्या आपको यकीन है? मुझे लगता है कि इस दृश्य को बनाए रखा जाएगा [पर्यवेक्षण addSubview:], इसलिए आपको इसे जारी करने में सक्षम होना चाहिए।
क्रिस्टोफर जॉन्सन

यदि आप presentWithSuperview को कॉल करते हैं तो टेस्टव्यू जारी करें यह क्रैश हो जाता है। यह किसी भी नेविगेशनकंट्रोलर टूलबार आदि के तहत "डिस्प्ले" भी प्रदर्शित करता है
रयान बुकर

इसने लंबे समय तक मेरे लिए ठीक काम किया है, लेकिन अब यह लैंडस्केप मोड में काम नहीं करता है। किसी को भी यह एक ही मुद्दा है?
जेफ्री वैन डे वुर्स्ट

19

IOS 8 में ऐसा करने के लिए Apple द्वारा अनुमोदित तरीका modalPresentationStyle को 'UIModalPresentationOverCurrentContext' पर सेट करना है।

UIViewController प्रलेखन से:

UIModalPresentationOverCurrentContext

एक प्रस्तुति शैली जहां सामग्री केवल मूल दृश्य नियंत्रक की सामग्री पर प्रदर्शित होती है। प्रस्तुत सामग्री के नीचे के दृश्य प्रस्तुति के समाप्त होने पर पदानुक्रम से हटाए नहीं जाते हैं। इसलिए यदि प्रस्तुत दृश्य नियंत्रक अपारदर्शी सामग्री के साथ स्क्रीन को नहीं भरता है, तो अंतर्निहित सामग्री से पता चलता है।

पॉपओवर में व्यू कंट्रोलर को प्रस्तुत करते समय, इस प्रस्तुति शैली का समर्थन केवल तभी किया जाता है जब संक्रमण शैली UIModalTransitionStyleCoverVertical हो। एक भिन्न संक्रमण शैली का उपयोग करने का प्रयास एक अपवाद को ट्रिगर करता है। हालाँकि, आप अन्य संक्रमण शैलियों (आंशिक कर्ल संक्रमण को छोड़कर) का उपयोग कर सकते हैं यदि मूल दृश्य नियंत्रक किसी पॉपओवर में नहीं है।

आईओएस 8.0 और बाद में उपलब्ध है।

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/

WWDC 2014 के 'व्यू कंट्रोलर एडवांसमेंट इन आईओएस 8' वीडियो कुछ विस्तार से इसमें शामिल हैं।

अपने प्रस्तुत दृश्य नियंत्रक को एक स्पष्ट पृष्ठभूमि रंग देना सुनिश्चित करें (अन्यथा, यह अभी भी अपारदर्शी दिखाई देगा)।


यह मुझे iOS8 और iOS9 पर एक काली स्क्रीन देता है
अमित हुड्डा

वास्तव में यह काम करता है यदि आप अपने दृश्य नियंत्रक के दृश्य को 1 से नीचे के अल्फा मान के साथ पृष्ठभूमि रंग में सेट करते हैं
पियरे

16

एक और विकल्प है: मोडल कंट्रोलर दिखाने से पहले, पूरी विंडो के स्क्रीनशॉट को कैप्चर करें। कैप्चर की गई छवि को UIImageView में डालें और उस नियंत्रक के दृश्य में छवि दृश्य जोड़ें जो आप दिखाने जा रहे हैं। फिर वापस भेजें। छवि दृश्य के ऊपर एक और दृश्य डालें (पृष्ठभूमि काला, अल्फा 0.7)। अपना मोडल कंट्रोलर दिखाएं और ऐसा लगता है कि यह पारदर्शी था। अभी इसे आईओएस 4 पर चलाने की कोशिश की आईओएस 4.3.1। आकर्षण की तरह।


अच्छा है, मैं इसे लागू करता हूं यह मेरे लिए बहुत अच्छा था। मेरे कोड का पालन करें जो इस अवधारणा का पालन करते हैं।
ईशू

किसी ने नहीं कहा कि यह आसान होने जा रहा है! :-)
क्रुमेलूर

आप इस दृष्टिकोण के साथ डिवाइस रोटेशन का समर्थन कैसे करेंगे?
काइल क्लेग

10

यह काफी पुराना है, लेकिन मैंने इस समस्या को निम्नानुसार हल किया है: चूंकि मुझे iPhone में एक नेविगेशन नियंत्रक पेश करने की आवश्यकता है, एक सबव्यू जोड़ना एक व्यवहार्य समाधान नहीं था।

तो मैंने क्या किया:

1) दृश्य नियंत्रक पेश करने से पहले, अपनी वर्तमान स्क्रीन का स्क्रीनशॉट लें:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

2) वह दृश्य नियंत्रक बनाएं जिसे आप प्रस्तुत करना चाहते हैं, और पृष्ठभूमि को एक सबव्यू के रूप में जोड़ें, इसे वापस भेज रहे हैं।

UIViewController * presentingVC = [UIViewController new];
UIImageView * backgroundImageOfPreviousScreen = [[UIImageView alloc] initWithImage:backgroundImage];
[presentingVC.view addSubview:backgroundImageOfPreviousScreen];
[presentingVC.view sendSubviewToBack:backgroundImageOfPreviousScreen];

3) अपना दृश्य नियंत्रक प्रस्तुत करें, लेकिन इससे पहले कि नए दृश्य नियंत्रक में, दृश्यदर्शी में एक पारदर्शी दृश्य जोड़ें (मैंने ILTranslucentView का उपयोग किया)

-(void)viewDidLoad
{
    [super viewDidLoad];
    ILTranslucentView * translucentView = [[ILTranslucentView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:translucentView];
    [self.view sendSubviewToBack:translucentView];
}

और बस यही!


बहुत बढ़िया। सभी ने पारभासी दृष्टिकोण के साथ अच्छी तरह से काम किया जिससे स्क्रीन शॉट गायब हो गया।
मीकल शट्ज

यह एक महान उपाय है! पॉपअप के लिए कंट्रोलर कोड को पेरेंट व्यू कंट्रोलर से अलग रखने के लिए बेहतर है।
1kmonkies

मेरे लिए काम किया, लेकिन बैकग्राउंड सेट करना
दृश्य

5

मैंने एक अलग प्रश्न में इसके बारे में अपने निष्कर्षों को लिखा , लेकिन इसका सार यह है कि आपको modalPresentationStyle = UIModalPresentationCurrentContextइस समय जो भी पूर्ण स्क्रीन का मालिक है, उस पर कॉल करना होगा। अधिकांश समय, यह जो कुछ भी है [UIApplication sharedApplication] .delegate.window के rootViewtontroller है। यह एक नया UIViewController भी हो सकता है जिसे प्रस्तुत किया गया था modalPresentationStyle = UIModalPresentationFullScreen

कृपया मेरी अन्य अधिक विस्तृत पोस्ट पढ़ें यदि आप सोच रहे हैं कि मैंने विशेष रूप से इस समस्या को कैसे हल किया है। सौभाग्य!


5

यह IOS 8 में टूटा हुआ प्रतीत होता है, मैं एक नेविगेशन नियंत्रक का उपयोग कर रहा हूं और जो संदर्भ प्रदर्शित किया जा रहा है वह नेविगेशन मेनू संदर्भ है जो हमारे मामले में एक स्लाइडिंग मेनू नियंत्रक है।

हम पॉड 'TWTSideMenuViewController' का उपयोग कर रहे हैं, '0.3' ने यह देखने के लिए जाँच नहीं की है कि क्या यह अभी तक लाइब्रेरी के साथ कोई समस्या है या ऊपर वर्णित विधि है।


5

यह मेरे लिए 8-9 iOS में काम करता है:

1- एक अल्फा के साथ अपने व्यू कंट्रोलर का बैकग्राउंड सेट करें

2- इस कोड को जोड़ें:

TranslucentViewController *tvc = [[TranslucentViewController alloc] init];
self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[tvc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

[self.navigationController presentViewController:tvc animated:YES completion:nil];

4

मुझे पता है कि यह बहुत पुराना सवाल है। मैं इस मुद्दे पर अटक गया था और मैं इस धागे से लीड पाने में सक्षम था। तो यहाँ डाल मैं कैसे काम किया :)। मैं स्टोरीबोर्ड का उपयोग कर रहा हूं और मेरे पास ViewController का तर्क है जिसे प्रस्तुत किया जाना है। व्यू कंट्रोलर में पारदर्शी बैकग्राउंड कलर होता है। अब सेगमेंट के एट्रिब्यूट्स इंस्पेक्टर में मैंने प्रस्तुति को "वर्तमान संदर्भ में" सेट किया। और यह मेरे लिए काम कर गया। मैं iPhone के लिए विकसित कर रहा हूं।

सहयोगी के निरीक्षक


धन्यवाद, यह भी सेट द्वारा काम करता है UIModalPresentationStyle.OverCurrentContext प्रोग्रामेटिक रूप से
guoleii

3

मैंने अतिरिक्त UIWindow पर मोडल फॉर्म शीट पेश करने के लिए ओपन सॉरेज़ लाइब्रेरी MZFormSheetController बनाया है । आप इसका उपयोग पारदर्शिता मोडल दृश्य नियंत्रक को प्रस्तुत करने के लिए कर सकते हैं, यहां तक ​​कि प्रस्तुत दृश्य नियंत्रक के आकार को भी समायोजित कर सकते हैं।


क्या आप बता सकते हैं कि इसका उपयोग कैसे करना है? क्योंकि जब मैं कोड का आह्वान करने की कोशिश करता हूं तो यह SIGABRT का कारण बनता है।
मटरू अलेक्जेंडर

3

मेरी हालत में मैं एक ही viewController पर देख रहा हूँ। इसलिए UIView धारण करने के लिए एक नया दृश्य नियंत्रक बनाएं। यह अल्फा गुण सेट करके उस दृश्य को पारदर्शी बनाएं। फिर एक बटन पर क्लिक करें मैंने यह कोड लिखा था। अच्छा लग रहा है।

UIGraphicsBeginImageContext(objAppDelegate.window.frame.size);
    [objAppDelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();



    UIViewController *controllerForBlackTransparentView=[[[UIViewController alloc] init] autorelease];
    [controllerForBlackTransparentView setView:viewForProfanity];

    UIImageView *imageForBackgroundView=[[UIImageView alloc] initWithFrame:CGRectMake(0, -20, 320, 480)];
    [imageForBackgroundView setImage:viewImage];

    [viewForProfanity insertSubview:imageForBackgroundView atIndex:0];

    [self.navigationController presentModalViewController:controllerForBlackTransparentView animated:YES];

और यह दिखाता है कि मुझे क्या चाहिए। आशा है कि यह किसी एक की मदद करेगा।


2

यहां मैंने एक श्रेणी बनाई है जो समस्या का समाधान करेगी।

    //
    //  UIViewController+Alerts.h
    //

    #import <UIKit/UIKit.h>

    @interface UIViewController (Alerts)

    - (void)presentAlertViewController:(UIViewController *)alertViewController animated:(BOOL)animated;
    - (void)dismissAlertViewControllerAnimated:(BOOL)animated;

    @end


    //
    //  UIViewController+Alerts.m
    //

    #import "UIViewController+Alerts.h"

    @implementation UIViewController (Alerts)

    - (void)presentAlertViewController:(UIViewController *)alertViewController animated:(BOOL)animated
    {
            // Setup frame of alert view we're about to display to just off the bottom of the view
            [alertViewController.view setFrame:CGRectMake(0, self.view.frame.size.height, alertViewController.view.frame.size.width, alertViewController.view.frame.size.height)];

            // Tag this view so we can find it again later to dismiss
            alertViewController.view.tag = 253;

            // Add new view to our view stack
            [self.view addSubview:alertViewController.view];

            // animate into position
            [UIView animateWithDuration:(animated ? 0.5 : 0.0) animations:^{
                    [alertViewController.view setFrame:CGRectMake(0, (self.view.frame.size.height - alertViewController.view.frame.size.height) / 2, alertViewController.view.frame.size.width, alertViewController.view.frame.size.height)];
            }];      
    }

    - (void)dismissAlertViewControllerAnimated:(BOOL)animated
    {
            UIView *alertView = nil;

            // find our tagged view
            for (UIView *tempView in self.view.subviews)
            {
                    if (tempView.tag == 253)
                    {
                            alertView = tempView;
                            break;
                    }
            }

            if (alertView)
            {
                    // clear tag
                    alertView.tag = 0;

                    // animate out of position
                    [UIView animateWithDuration:(animated ? 0.5 : 0.0) animations:^{
                            [alertView setFrame:CGRectMake(0, self.view.frame.size.height, alertView.frame.size.width, alertView.frame.size.height)];
                    }];      
            }
    }

    @end

4
FYI करें, बर्खास्त करने की विधि में अपने दम पर साक्षात्कार के माध्यम से लूप करने की कोई आवश्यकता नहीं है। यह फ्रेमवर्क आपके लिए [self.view viewWithTag: 253] के साथ करेगा;
स्टीव

इस उदाहरण पर डेव वुड की श्रेणी आपके विचार को इस प्रकार प्रदर्शित करती है। इसलिए आपको पारभासी प्रभाव प्राप्त करने के लिए अपने xib के दृश्य की अल्फा सेटिंग को 1 से कम पर सेट करना होगा।
तुलसी बोर्क

स्क्रॉल श्रेणी के दृश्य जैसे कि तालिका दृश्य: स्क्रॉलिंग कार्य पर प्रस्तुत करने पर इस श्रेणी की समस्या होती है। यह बुरी बात है। उपयोगकर्ता प्रस्तुत दृश्य को ऑफ-स्क्रीन स्क्रॉल कर सकता है। अंतर्निहित प्रस्तुति दृश्य की सामग्री स्क्रीन पर आती है।
तुलसी बोर्क

मैंने इस श्रेणी को अपडेट किया है। आप कोड यहाँ प्राप्त कर सकते: gist.github.com/4423365 । मैं आपके द्वारा बताई गई स्क्रॉलिंग समस्या के बिना तालिका दृश्य और संग्रह दृश्य पर इसका उपयोग करता हूं।
डेव वुड

2

बहुत सारे शोध के बाद ऐसा लगता है कि यह हमारे मुद्दे को हल करेगा और हमारे उद्देश्य की पूर्ति करेगा।

पहचान के साथ कुलपति को गंतव्य वीसी से गंतव्य के लिए एक सेगेट बनाएं।

उदाहरण के लिए "goToDestinationViewController" जीवन को आसान बनाने के लिए ठीक है चलो वर्तमान दृश्य नियंत्रक पर विचार करें अर्थात, आप अपने पारदर्शी दृश्य के पीछे स्रोत और गंतव्य के रूप में गंतव्य के रूप में चाहते हैं।

अब देखने में स्रोत कुलपति मेंDidLoad: या देखें

performSegueWithIdentifier("goToDestinationViewController", sender: nil)

अच्छा हम आधा रास्ता है। अब अपने स्टोरीबोर्ड पर जाएं। Segue पर क्लिक करें। जो इस तरह दिखना चाहिए: बहस

दिखाए गए विकल्पों को बदलें।

अब असली समाधान आता है।

अपने गंतव्य दृश्य नियंत्रक के दृश्य में यह कोड जोड़ें।

self.modalPresentationStyle = .Custom

……………………………………………। .......................बहुत आसान......................... ……………………………………।


1
self.modalPresentationStyle = .customमेरे लिए स्विफ्ट 3, Xcode 8 में पारदर्शी पृष्ठभूमि के साथ वास्तविक दृश्य नियंत्रक पेश करने के लिए औपचारिक रूप से कार्य करना । एकमात्र मुद्दा यह है कि यदि प्रस्तुत दृश्य नियंत्रक टैब बार नियंत्रक में एम्बेडेड है, तो टैब बार पारदर्शी के सामने दिखाई देता है पृष्ठभूमि का दृश्य।
mtso

इसलिए - यदि एक टैब बार उपयोग में है - तो वर्तमान दृश्य नियंत्रक tabBarController.tabBar.isHiddenको इसके लिए सेट किया जाना चाहिए true
mtso

1

वैकल्पिक तरीका "कंटेनर दृश्य" का उपयोग करना है। बस 1 से नीचे अल्फा बनाएं और seque के साथ एम्बेड करें। XCode 5, iOS7 को लक्षित करें।

छवि नहीं दिखा सकते, पर्याप्त प्रतिष्ठा नहीं)))

IOS6 से उपलब्ध कंटेनर दृश्य।


1

यह कोड iOS6 और iOS7 के तहत iPhone पर ठीक काम करता है:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

लेकिन इस तरह से आप 'स्लाइड-टू-द-बॉटम' एनीमेशन को ढीला कर देते हैं।


यह मेरे लिए iPhone पर काम नहीं करता है। नीचे का दृश्य अभी भी गायब है। मेरा मानना ​​है कि modalPresentationStyle केवल iPad पर लागू होता है।
जेसपिन्हो

यदि आप चाहें तो मैं आपको परिणामी प्रभाव की स्क्रीन भेज सकता हूं। शायद आपके कार्यान्वयन में कुछ गड़बड़ है।
11

आह ... यह इसलिए था क्योंकि मुझे पता नहीं था कि व्यू कंट्रोलर को फुल स्क्रीन होना चाहिए। (मिस्टर टी की टिप्पणी देखें।)
जेसेपिन्हो

1

आईओएस 7 और इसके बाद के संस्करण के लिए मुझे यह सुरुचिपूर्ण और सरल समाधान मिला!

IOS 8 के लिए Apple ने UIModalPresentationOverCurrentContext जोड़ा, लेकिन यह iOS 7 और पूर्व के लिए काम नहीं करता है, इसलिए मैं इसे अपने मामले के लिए उपयोग नहीं कर सका।

कृपया, श्रेणी बनाएं और निम्नलिखित कोड डालें।

.h फाइल

typedef void(^DismissBlock)(void);

@interface UIViewController (Ext)

- (DismissBlock)presentController:(UIViewController *)controller
              withBackgroundColor:(UIColor *)color
                         andAlpha:(CGFloat)alpha
                presentCompletion:(void(^)(void))presentCompletion;

@end

.m फ़ाइल

#import "UIViewController+Ext.h"

@implementation UIViewController (Ext)

- (DismissBlock)presentController:(UIViewController *)controller
              withBackgroundColor:(UIColor *)color
                         andAlpha:(CGFloat)alpha
                presentCompletion:(void(^)(void))presentCompletion
{
    controller.modalPresentationStyle = UIModalPresentationCustom;

    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    __block UIView *overlay = [[UIView alloc] initWithFrame:keyWindow.bounds];
    if (color == nil) {
        color = [UIColor blackColor];
    }
    overlay.backgroundColor = color;
    overlay.alpha = alpha;

    if (self.navigationController != nil) {
        [self.navigationController.view addSubview:overlay];
    }
    else if (self.tabBarController != nil) {
        [self.tabBarController.view addSubview:overlay];
    }
    else {
        [self.view addSubview:overlay];
    }

    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:controller
                       animated:true
                     completion:presentCompletion];

    DismissBlock dismissBlock = ^(void) {
        [self dismissViewControllerAnimated:YES completion:nil];
        [UIView animateWithDuration:0.25
                         animations:^{
                             overlay.alpha = 0;
                         } completion:^(BOOL finished) {
                             [overlay removeFromSuperview];
                         }];
    };
    return dismissBlock;
}

@end

नोट: यह नेवीगेशनकंट्रोलर, टैबबारकंट्रोलर के लिए भी काम करता है।

उपयोग का उदाहरण:

       // Please, insure that your controller has clear background
       ViewController *controller = [ViewController instance];
        __block DismissBlock dismissBlock = [self presentController:controller
                                                withBackgroundColor:[UIColor blackColor]
                                                           andAlpha:0.5
                                                  presentCompletion:nil];
        // Supposed to be your controller's closing callback
        controller.dismissed = ^(void) {
            dismissBlock();
        };

का आनंद लें! और कृपया, कुछ प्रतिक्रियाएं छोड़ें।


0

यह अब तक का सबसे अच्छा और साफ तरीका है:

@protocol EditLoginDelegate <NSObject>

- (void)dissmissEditLogin;

@end

- (IBAction)showtTransparentView:(id)sender {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"foo bar"
                                                         delegate:self
                                                cancelButtonTitle:@"cancel"
                                           destructiveButtonTitle:@"destructive"
                                                otherButtonTitles:@"ok", nil];

    [actionSheet showInView:self.view];

}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet{

    UIStoryboard *loginStoryboard     = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
    self.editLoginViewController      = [loginStoryboard instantiateViewControllerWithIdentifier:@"EditLoginViewController"];

    self.editLoginViewController.delegate = self;

    [self.editLoginViewController viewWillAppear:NO];
    [actionSheet addSubview:self.editLoginViewController.view];
    [self.editLoginViewController viewDidAppear:NO];
}

0

सबसे अच्छा समाधान जो मैं भर में आया हूं वह है AddChildViewController विधि का उपयोग करना। यहाँ एक उत्कृष्ट उदाहरण है: पेरेंट व्यू कंट्रोलर के एक उप-दृश्य के लिए एक बच्चा दृश्य नियंत्रक का दृश्य जोड़ें


0

मैं हल करने के लिए कई तरीकों का उपयोग करने की कोशिश करता हूं, लेकिन फिर भी असफल रहा, अंत में लागू कोड का पालन किया गया।

स्विफ्ट द्वारा संकल्प:

// A.swift init method
modalPresentationStyle = .currentContext // or overCurrentContent
modalTransitionStyle = .crossDissolve // dissolve means overlay

तब बी व्यू कंट्रोलर में :

// B.swift
let a = A()
self.present(a, animated: true, completion: nil)

आपको ViewController की पृष्ठभूमि को भी पारदर्शी बनाना होगा। view.backgroundColor = UIColor.clear
माइकल हेनरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.