आईओएस: पारदर्शी पृष्ठभूमि के साथ मोडल व्यूकंट्रोलर


180

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

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

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


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

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

IOS 8 के लिए यहां मेरा जवाब देखें stackoverflow.com/a/29794201/1606125
पंकज वाधवा

स्विफ्ट संस्करण यहां stackoverflow.com/a/34578402/3380878
Mojtabye

1
IOS 10 के लिए UIModalPresentationOverFullScreen काम कर रहा है जैसा कि नीचे उल्लेख किया गया है।
जोसेफ रियानेक

जवाबों:


97

यह निम्न कोड केवल iPad पर काम करता है।

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

मैं एक उप दृश्य जोड़ने के साथ जाना होगा।

यहाँ एक बहुत अच्छी चर्चा है। टिप्पणियों को विशेष रूप से देखें। उत्तर ही नहीं।

मोडल व्यू

अगर मैं तुम होते तो मैं ऐसा नहीं करता। मैं एक उप दृश्य जोड़ूंगा और करूंगा। यह मुझे चीजों पर बेहतर नियंत्रण देने के लिए लगता है।

संपादित करें:

जैसा कि पॉल लिंसे ने उल्लेख किया है, आईओएस 8 के बाद से यह आवश्यक है UIModalPresentationOverFullScreenकि व्यू कॉन्ट्रोलर के modalPresentationStyle के लिए प्रस्तुत किया जा रहा है। यह नेविगेशनबेर और टैबबार बटन को भी कवर करेगा।


18
यह iOS 7 और iPhone पर भी काम करता है , बात यह है कि आपको प्रस्तुतकर्ता दृश्य नियंत्रक modalPresentationStyle = UIModalPresentationCurrentContextपर निर्दिष्ट करना होगा , और प्रस्तुत एक में नहीं ।
redent84

6
हां यह काम करता है लेकिन केवल अगर आप इसे अपने दृश्य पदानुक्रम के उच्च पर सेट ViewControllerकरते हैं। (उदाहरण NavigationControllerके लिए या उदाहरण के लिए आपके स्लाइड मेनू व्यू कंट्रोलर का उदाहरण)।
.ग्रान्डव

4
अजीब बात है, मेरे मामले में यह केवल मोडल स्टाइल को सेट करने के बाद काम करता है UIModalPresentationCustom, और केवल अगर यह इसके presentViewControllerबजाय पहले से सही सेट है viewDidLoad
मोज़ुबा

5
IOS 8 के बाद से सभी की जरूरत है कि UIModalPresentationOverFullScreen के लिए modalPresentationStyle ViewController के प्रस्तुत किया जा रहा है।
पॉल लिंसे

1
लगभग 1000 प्रयासों के बाद, मुझे एहसास हुआ कि आपको modalPresentationStyle पहलेviewDidLoad सेट करने की आवश्यकता है । मैंने इसे कंस्ट्रक्टर में किया और यह काम कर गया।
बेंडाईट्री

186

IOS 8 में काम करने की कोशिश करने वालों के लिए, पारदर्शी एडल व्यू कंट्रोलर को प्रदर्शित करने का "Apple-स्वीकृत" तरीका modalPresentationStyle वर्तमान एड कंट्रोलर पर सेटिंग करके है UIModalPresentationOverCurrentContext

इसे कोड में, या स्टोरीबोर्ड में सेग के गुणों को सेट करके किया जा सकता है।

UIViewController प्रलेखन से:

UIModalPresentationOverCurrentContext

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

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

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

https://developer.apple.com/documentation/uikit/uiviewcontroller

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

ध्यान दें:

  • अपने प्रस्तुत दृश्य नियंत्रक को एक स्पष्ट पृष्ठभूमि रंग देना सुनिश्चित करें, ऐसा न हो कि यह वास्तव में देखने के माध्यम से न हो!
  • आपको इसे प्रस्तुत करने से पहले सेट करना होगा अर्थात प्रस्तुत करने वाले ViewController के इस पैरामीटर को सेट करने सेviewDidLoad कोई प्रभाव नहीं पड़ेगा

32
नोट - यह वह लक्ष्य प्रतीत होता है जहाँ आपको modalPresentationStyle सेट करना होगा , बदल गया है। उदाहरण के लिए, iOS 7 में, काम करने के लिए इसे पाने के लिए, मैं सेट करने के लिए आवश्यक modalPresentationStyle देखें नियंत्रक (रों) जो करने के लिए मॉडल को खोलने के लिए प्रयास कर रहा था की UIModalPresentationCurrentContext । हालाँकि, इसे iOS8 में काम करने के लिए, मुझे modalPresentationStyle को सेट करने की आवश्यकता है, जो कि UIModalPresentationOverCurrentContext को प्रदर्शित होने वाली है
u2Fan

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

मैंने प्रस्तुत दृश्य नियंत्रक में इन तीन पंक्तियों को इनिट विधि से जोड़ा, और एक आकर्षण की तरह काम करता है: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [स्व सेटमॉडल अप्रेंटिसटाइटल: UIModalPresentationOverCurrentContext];
inigo333

2
IOS 8+ पर, मुझे UINavigationController से एक मोडल पेश करना था, इसलिए एक बच्चे से प्रस्तुत करने से मुझे वह नहीं मिला जो मुझे चाहिए था। इसके बजाय, sourceVCहै self.navigationController। इसके अलावा, लक्ष्य प्रस्तुति शैली को कस्टम के रूप में स्थापित करने के बाद ही मैं इसके माध्यम से देख सकता था। [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];उम्मीद है कि यह किसी की मदद करेगा।
devdc

नोट - कॉल presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextमें पेश कुलपति। प्रस्तुत में काम नहीं करता है। मुझ पर भरोसा करो, मैंने कोशिश की।
स्मेहम

104

IOS 8.0 और इसके बाद के संस्करण में यह संपत्ति modalPresentationStyle को UIModalPresentationOverCurrentContext पर सेट करके किया जा सकता है

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

देखें छवि संलग्न


5
यह एकमात्र उपाय है जिससे मुझे काम मिल सकता है। साथ ही बहुत ही सरल। इसे अपने वर्तमान वीसी से मोडल सेगमेंट से पहले जोड़ें।

1
Xcoe 9.2 / iOS 11.2 स्विफ्ट .customऔर .overFullScreenकाम।
विलियम हू

और लगता है कि यदि आप .overFullScreenवर्तमान दृश्य नियंत्रक सेट करते हैं तो viewWillAppearउसे कॉल नहीं किया जाएगा।
विलियम हू

एक और बात, 's' presentedController.view.backgroundColor = #color#में लिखा जाना चाहिए , अन्यथा जीवन बाधित है। presentedControllerviewDidLoadpresentedController
डॉनसॉन्ग

44

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

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

इस मामले में आप स्लाइड-ऑन एनीमेशन को याद करते हैं। एनीमेशन को बनाए रखने के लिए आप अभी भी "गैर-सुरुचिपूर्ण" एक्सटेंशन का उपयोग कर सकते हैं:

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

यदि हमारा प्रेजेंटिव UINavigationController या UITabbarController के अंदर स्थित है, तो आपको उस कंट्रोलर के साथ प्रेजेंट करने की आवश्यकता होती है, जैसे कि प्रेजिंगवीवी।

इसके अलावा, iOS7 में आप कस्टम ट्रांस्फ़ॉर्मेशन एनीमेशन लागू करने वाले UIViewControllerTransitioningDelegateप्रोटोकॉल को लागू कर सकते हैं । बेशक, इस मामले में आप पारदर्शी पृष्ठभूमि प्राप्त कर सकते हैं

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

सबसे पहले, प्रस्तुत करने से पहले आपको सेट करना होगा modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

फिर आपको दो प्रोटोकॉल विधियों को लागू करना होगा

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

आखिरी चीज CustomAnimatedTransitioningकक्षा में आपके कस्टम संक्रमण को परिभाषित करना है

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

7
इस काम की पुष्टि की। ध्यान दें कि यदि आपका viewController एक नैविगेशनकंट्रोलर के अंदर है, तो सुनिश्चित करें कि modalPresentationStyleयह भी सेट है!
mxcl

मुझे लगता है कि सबसे सामान्य मामलों में अपने नेविगेशन कंट्रोलर को प्रेजेंटेवी के रूप में व्यवहार करना अच्छा है।
पुरुष डेस

हां, इस modalPresentationStyle का उपयोग करते हुए प्रस्तुतिकरण प्राप्त करना असंभव है ((
पुरुष

2
@alex हाँ, यह खेद के साथ काम करता है: मेरी गलती pralstingVC के बजाय प्रस्तुत किए गएVC के लिए UIModalPresentationCurrentContext को modalPresentationStyle सेट करना था।
टाइगरू

5
@ mxcl और अगर आपका व्यूकंट्रोलर का नेविगेशनकंट्रोलर अपने आप में एक टैबरकार्ट्रोलर के अंदर है तो सुनिश्चित करें कि इसका मोडलप्रेशनेशन सेट भी सेट है;)
थॉमस सीजी डी

21

मैंने प्रस्तुत शैली को @VenuGopalTariari के रूप में सेट करने के लिए XCode 7 के इंटरफ़ेस बिल्डर के साथ थोड़ा संघर्ष किया। इस संस्करण में, सेग के लिए कोई Over Current Contextया Over Full Screenप्रस्तुति मोड नहीं लगता है । इस प्रकार, इसे काम करने के लिए, मैंने मोड को Defaultनिम्न पर सेट किया है :

यहां छवि विवरण दर्ज करें साथ में यहां छवि विवरण दर्ज करें

इसके अतिरिक्त मैंने सामान्य रूप से प्रस्तुत दृश्य नियंत्रक की प्रस्तुति मोड को Over Full Screenनिम्न पर सेट किया है :

यहां छवि विवरण दर्ज करें


यह मेरे लिए काम करता है, कोई कोड की आवश्यकता नहीं है। मैं Xcode 7.2 का उपयोग कर रहा हूं, तेज और लक्ष्य iOS 8.0 है
लाइटमैन

इसने मेरे लिए भी काम किया। सही उत्तर के लिए +1। धन्यवाद :)
ऑगस्टीन पीए

सबसे अच्छा जवाब यहाँ!
चमकदार

1
कोई कोड नहीं = सर्वश्रेष्ठ उत्तर। बास्टियन ने यह गेम जीता। इस उत्तर को सभी +1 करें।
१६:४४ पर जीनकोड

इस उत्तर ने काम
किया..इस

18

मामूली रूप से प्रस्तुत करने के लिए एक सेगेट बनाएं और उस सेगमेंट की प्रेजेंटेशन प्रॉपर्टी को वर्तमान संदर्भ में सेट करें, यह 100% काम करेगा

यहां छवि विवरण दर्ज करें


3
मैं 100% सर्वर्स की प्रशंसा करता हूं, यह काम करता है! कुंजी इसे सेग पर लागू करना है। बहुत बहुत धन्यवाद
Badr

यदि आपके पास आपका सेगमेंट एक बटन तक नहीं है और आप इसे प्रोग्रामेटिक रूप से कॉल कर रहे हैं, तो एक पहचानकर्ता सेट करने के लिए और presentViewCithIdentifier को कॉल करने के लिए सुनिश्चित करें बजाय presentViewController के
user3344977

1
मैंने अन्य सभी उत्तरों की कोशिश की, लेकिन यह एकमात्र ऐसा है जिसने iOS9 में मेरे लिए काम किया।
एंडविएड

14

PresentViewController पारदर्शी पृष्ठभूमि के साथ - iOS 8 और iOS 9 में

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

और MYViewController में पृष्ठभूमि का रंग काला है और अस्पष्टता को कम करता है


12

यह थोड़ा हैक करने का तरीका है, लेकिन मेरे लिए यह कोड काम करता है (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

यह कोड आईफोन पर भी काम करता है


धन्यवाद - यह वही है जो मुझे चाहिए था - मुख्य घर के शीर्ष पर एक प्रारंभिक "सहायता" स्क्रीन दिखा रहा है। सुंदर!
मैट एच

1
आज, मैं लगभग 3 घंटे ब्राउज़िंग और समाधान के लिए खोज करता हूं जो iOS7 और iOS8 दोनों के लिए काम करता है। इस तथ्य को ध्यान में रखते हुए कि यह उत्तर 1.5 वर्ष पुराना है और मैं ECSlidingViewController का उपयोग कर रहा हूं, यह एकमात्र समाधान है जिसने काम किया है! धन्यवाद @ माक।
सेंचुरियन

उत्तम। इसके अलावा, यदि आप एनीमेशन के बारे में परवाह नहीं करते हैं, तो आंतरिक पूर्णता में 3 लाइनें पूरी तरह से काम करती हैं धन्यवाद!
RasTheDestroyer

बिना किसी सफलता के 3 घंटे बिताने के बाद यह पाया, चीयर्स, काश मैं और वोट कर पाता: D
alessioarsuffi

11

इस श्रेणी ने मेरे लिए काम किया (ios 7, 8 और 9)

ज फाइल

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

एम फ़ाइल

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
मैंने सभी उत्तर की जाँच की .. लेकिन मेरे लिए आपका उत्तर एकदम सही है .. "+1" इसके लिए। @ टेड
g212gs

1
मुझे लगा कि मुझे कोई हल नहीं मिल रहा है। आपका बहुत बहुत धन्यवाद!
कॉपरकैश

10

स्विफ्ट का उपयोग कर इस उत्तर का समाधान इस प्रकार होगा।

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

यदि आप स्टोरीबोर्ड का उपयोग कर रहे हैं, तो आप इस चरण का अनुसरण कर सकते हैं:

  1. व्यू कंट्रोलर (V2) जोड़ें, UI को जिस तरह से आप चाहते हैं, सेटअप करें
  • एक UIView जोड़ें - पृष्ठभूमि को काला और अपारदर्शिता को 0.5 पर सेट करें
  • एक और UIView (2) जोड़ें - जो आपके पॉपअप के रूप में काम करेगा (Pls ध्यान दें कि UIView और UIView (2) का समान स्तर / पदानुक्रम होना चाहिए। न ही चित्र को दृश्य का बच्चा बनाएं अन्यथा uiview की अस्पष्टता होगी) प्रभावित UIView (2))
  1. वी 2 को सामान्य रूप से प्रस्तुत करें

  2. सेग पर क्लिक करें। गुण निरीक्षक में, पूर्ण स्क्रीन के रूप में प्रस्तुति सेट करें । अगर आपको पसंद है तो एनीमेशन निकालें

स्टोरीबोर्ड

  1. V2 का चयन करें। गुण निरीक्षक में, पूर्ण स्क्रीन के रूप में प्रस्तुति सेट करें । चेक को परिभाषित करता है और संदर्भ प्रदान करता है

स्टोरीबोर्ड

  1. अपने V2 (Pls। चेक इमेज) के मुख्य दृश्य का चयन करें। बैकग्राउंड कलर करने के लिए बैकग्राउंड सेट करें

स्टोरीबोर्ड


6

मैंने प्रस्तुत दृश्य नियंत्रक में इन तीन पंक्तियों को इनिट विधि से जोड़ा, और एक आकर्षण की तरह काम करता है:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

EDIT (iOS 9.3 पर काम कर रहे):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

प्रलेखन के अनुसार:

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

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


1
IOS 10.2 पर काम कर रहा है।
जोसेफ रियानेक

4

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

यहां छवि विवरण दर्ज करें

IOS6 से उपलब्ध कंटेनर दृश्य। उस बारे में ब्लॉग पोस्ट से लिंक करें


3

मैंने एक वस्तु को "सुपरपोज्ड मोडल" के रूप में प्रस्तुत करने के लिए बनाया है, जिसका अर्थ है कि यह पृष्ठभूमि के दृश्य को बनाए रखता है और आपको पारदर्शी पृष्ठभूमि के साथ एक मोडल रखने की अनुमति देता है।

इसकी एक एकल, सरल विधि है जो ऐसा करती है:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

modalPresentationCapturesStatusBarAppearanceसंपत्ति को सेट करने YESऔर स्टेटस बार उपस्थिति को अद्यतन करने के लिए मजबूर करने के लिए महत्वपूर्ण है , अगर आपके प्रस्तुत दृश्य नियंत्रक में एक अलग है preferredStatusBarStyle

यह ऑब्जेक्ट ए होना चाहिए @property (assign, nonatommic) isPresenting

आप इस वस्तु का पालन करना चाहते हैं UIViewControllerAnimatedTransitioningऔर UIViewControllerTransitioningDelegateप्रोटोकॉल और निम्न विधियों को लागू:

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

तथा:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

यह डिफ़ॉल्ट मोडल एनीमेशन की नकल करते हुए एक स्लाइड-इन-द-द-द-अंडर एनीमेशन करता है, लेकिन आप इसे जो चाहें बना सकते हैं।

महत्वपूर्ण बात यह है कि वर्तमान दृश्य नियंत्रक का दृश्य पीछे रहेगा, जिससे आप एक पारदर्शी प्रभाव बना सकते हैं।

यह समाधान iOS 7+ के लिए काम करता है


आपके उत्तर के लिए धन्यवाद।
सलमान खाकवानी

3

इसे करने का एक बहुत ही सरल तरीका है ( Storyboardsउदाहरण के लिए)

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

यह UIViewControllerएक Storyboardमामूली रूप से पेश करेगा , लेकिन एक पारदर्शी पृष्ठभूमि के साथ।


3

IOS 7-10 के लिए काम करना

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

यहाँ सभी अच्छे उत्तरों और टिप्पणियों को फिर से भरने के लिए और अभी भी आपके नए पर चलते समय एक एनीमेशन ViewControllerहै जो मैंने किया है: (iOS 6 और ऊपर का समर्थन करता है)

यदि आपका a UINavigationController\ UITabBarControllerयह जाने का तरीका है:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

यदि आप ऐसा करेंगे तो आप अपना modalTransitionStyleएनीमेशन खो देंगे । इसे हल करने के लिए आप आसानी से इसे अपनी SomeViewControllerकक्षा में जोड़ सकते हैं :

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

बेशक आपको UIModalPresentationCurrentContext सेट करना चाहिए, लेकिन ClearColor सेट करने का स्थान बहुत महत्वपूर्ण है! आप viewDidLoad फ़ंक्शन में बैकग्राउंड सेट नहीं कर सकते, इसे तब सेट करें जब व्यू रूट रूट कंट्रोलर की तरह लोड हो या कंट्रोलर के init फंक्शन में मौजूद हो!

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

या

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

यह संकेत था जिसने मुझे अन्य सभी के बीच मदद की। आपकी सहायता के लिए धन्यवाद।
टॉमस नाज़ेंको

1

यदि आप मोडल सेग का उपयोग कर रहे हैं, तो इसे इस छवि के रूप में सेट करना सुनिश्चित करें (यदि आप चाहें तो एनीमेशन को बंद कर सकते हैं)यहां छवि विवरण दर्ज करें


1

एक पूर्ण विधि iOS 7 और iOS 8 पर परीक्षण किया गया।

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

स्विफ्ट 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

अपील में:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

आप में पहला दृश्य नियंत्रक है जहाँ से आपको अगला दृश्य लोड करना है:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

अपने अगले दृश्य नियंत्रक में जो पारदर्शी जोड़ा जाना है:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

लॉगिन स्क्रीन एक मोडल है, जिसका अर्थ है कि यह पिछली स्क्रीन के शीर्ष पर बैठता है। अब तक हमारे पास ब्लर बैकग्राउंड है, लेकिन यह कुछ भी धुंधला नहीं कर रहा है; यह सिर्फ एक ग्रे बैकग्राउंड है।

हमें अपना मोडल ठीक से सेट करने की जरूरत है।

छवि लिंक लक्ष्य

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

  • दूसरा, हमें उस सेगमेंट का चयन करना होगा जो लॉगिन स्क्रीन की ओर जाता है, और एट्रीब्यूट इंस्पेक्टर में, प्रेजेंटेशन को ओवर करंट कॉनटेक्स्ट पर सेट करें। यह विकल्प केवल ऑटो लेआउट और आकार वर्गों के साथ उपलब्ध है।

छवि लिंक लक्ष्य


0

सेट नेविगेशन है modalPresentationStyleकरने के लिएUIModalPresentationCustom

और अपने प्रस्तुत दृश्य नियंत्रक की पृष्ठभूमि का रंग स्पष्ट रंग के रूप में सेट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.