IOS 13 फुलस्क्रीन में मोडल पेश करना


464

IOS 13 में प्रस्तुत किए जाने पर मोडल व्यू कंट्रोलर के लिए एक नया व्यवहार है।

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

मैं इस व्यवहार को कैसे रोक सकता हूं और पुराने फुलस्क्रीन मोडल वीसी पर वापस जा सकता हूं?

आदर्श व्यवहार

धन्यवाद

जवाबों:


621

IOS 13 के साथ, जैसा कि WWDC 2019 के दौरान यूनियन के प्लेटफ़ॉर्म स्टेट में कहा गया है , Apple ने एक नई डिफ़ॉल्ट कार्ड प्रस्तुति पेश की। फ़ुलस्क्रीन को मजबूर करने के लिए आपको इसे स्पष्ट रूप से निर्दिष्ट करना होगा:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

81
मैं कहूंगा कि यह डिफ़ॉल्ट के रूप में लंबे समय तक नहीं रहेगा। fullScreenविकल्प डिफ़ॉल्ट रूप तोड़ने यूआई परिवर्तन रोकने के लिए किया जाना चाहिए।
जैकब ट्रहला

17
मैं उस पर भरोसा नहीं करूंगा। अतीत में, Apple ने अक्सर डिफॉल्ट्स को बदल दिया है जो केवल सक्रिय हो रहा है एक बार जब आप वर्तमान एसडीके के खिलाफ लिंक कर रहे हैं। हम पिछले संस्करणों के खिलाफ लिंक करते समय पुराने व्यवहार को उम्मीद करेंगे ।
DrMickeyLauer

11
मैं पुष्टि कर सकता हूं कि iOS 13 सिम्युलेटर पर चलने वाले Xcode-10 निर्मित एप्लिकेशन अभी भी पूर्ण स्क्रीन के लिए डिफ़ॉल्ट हैं। जैसा कि @DrMickeyLauer ने कहा, Xcode 11 के साथ निर्माण करने से ऐप नए व्यवहार का विरोध करता है। isModalInPresentationबर्खास्तगी से स्वाइप जेस्चर को ब्लॉक करने के लिए उपयोग करें । अधिक जानकारी के लिए मेरा ब्लॉग पोस्ट देखें: मध्यम.
ज्योफ हैकवर्थ

5
मैं .overFullScreen के बजाय .fullScreen का उपयोग करने की सलाह देता हूं। .fullScreen आग देखती हैविशेषता और दृश्य देखने के लिए, .overFullScreen ऐसा नहीं करता
PiterPan

5
समय बीत चुका है और .automaticशैली डिफ़ॉल्ट के रूप में बस गई है, जो कि (अधिकांश दृश्य नियंत्रकों के लिए) .pageSheetशैली है। हालाँकि कुछ सिस्टम व्यू कंट्रोलर इसे अलग शैली में मैप कर सकते हैं।
जकूब त्राहालू

186

मैं एक जानकारी जोड़ता हूं जो किसी के लिए उपयोगी हो सकती है। आप किसी भी स्टोरीबोर्ड segue, पुरानी शैली के लिए वापस जाना है, तो आप स्थापित करने की आवश्यकता तरह के संपत्ति वर्तमान रीति से और प्रस्तुति के लिए संपत्ति पूर्ण स्क्रीन

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


2
वहाँ इंटरफ़ेस बिल्डर में एक तरीका है स्थापित करने के लिए isModalInPresentation?
ब्रैड थॉमस

इससे सहमत हैं। उच्चतम स्तर के आक्रामक दृश्य (ओं) के लिए प्रस्तुति मान बदलें।
डेविड

यह मेरे लिए काम किया है क्योंकि मेरे पास है performSegue। धन्यवाद प्रिय!
ब्लास्कांक

95

लॉन्च स्क्रीन के ठीक बाद के शुरुआती दृश्य में मेरे पास यह मुद्दा था। मेरे लिए यह तय है कि मेरे पास एक सेगमेंट या लॉजिक डिफाइन नहीं था, प्रेजेंटेशन को ऑटोमैटिक से फुलस्क्रीन पर स्विच करना था जैसा कि यहाँ दिखाया गया है:

fix_storyboard_presentation_default_behavior


1
क्या स्टोरीबोर्ड के माध्यम से एक-एक करने के बजाय सभी विचारों के लिए इस प्रोग्राम को करने का कोई तरीका है?
the1993

@ The1993 क्या आपको इसका कोई विकल्प मिला?
शोभित पुरी

1
@ शोभितपुरी ने ओमरेह द्वारा किए गए पहले समाधान पर एक नज़र डालते हैं यहां stackoverflow.com/a/58255416/4323101
The1993

1
वाह, यह मेरे मुद्दों के लिए जवाब था। पारितोषिक के लिए धन्यवाद! किसी भी अन्य के लिए भी इस में देख, यह पृष्ठभूमि से एप्लिकेशन को फिर से खोलने के बाद अजीब व्यवहार के लिए तय है। मेरे आवेदन में, पृष्ठभूमि से खोलना मेरी स्प्लैश स्क्रीन (प्रारंभिक दृश्य नियंत्रक) को कार्ड प्रस्तुति शैली के रूप में ओवरले करेगा और फिर यहां से कोई भी तर्क मेरी परिभाषित सेग शैली का उपयोग करने के बजाय क्रॉस-फेड हो जाएगा। यह ठीक होगा यदि मैंने ऐप को बंद कर दिया (होम टैप बटन पर टैप करें और स्वाइप करें, फिर से खोलें) लेकिन कोई भी अतिरिक्त लॉन्च इस अजीब व्यवहार का कारण बनेगा। एक बार फिर धन्यवाद!
जस्टिन

92

ऐसा करने के कई तरीके हैं, और मुझे लगता है कि हर एक एक प्रोजेक्ट के लिए फिट हो सकता है, लेकिन दूसरा नहीं, इसलिए मैंने सोचा कि मैं उन्हें यहां रखूंगा, हो सकता है कि कोई दूसरा किसी अलग मामले में चले।

1- ओवरराइड वर्तमान

यदि आपके पास एक है BaseViewControllerतो आप present(_ viewControllerToPresent: animated flag: completion:)विधि को ओवरराइड कर सकते हैं ।

class BaseViewController: UIViewController {

  // ....

  override func present(_ viewControllerToPresent: UIViewController,
                        animated flag: Bool,
                        completion: (() -> Void)? = nil) {
    viewControllerToPresent.modalPresentationStyle = .fullScreen
    super.present(viewControllerToPresent, animated: flag, completion: completion)
  }

  // ....
}

इस तरह से आपको किसी भी presentकॉल पर कोई भी बदलाव करने की आवश्यकता नहीं है , क्योंकि हम सिर्फ presentविधि को ओवररोड करते हैं ।

2- एक विस्तार:

extension UIViewController {
  func presentInFullScreen(_ viewController: UIViewController,
                           animated: Bool,
                           completion: (() -> Void)? = nil) {
    viewController.modalPresentationStyle = .fullScreen
    present(viewController, animated: animated, completion: completion)
  }
}

उपयोग:

presentInFullScreen(viewController, animated: true)

3- एक यूआईईवीवाईसींट्रोलर के लिए

let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)

4- स्टोरीबोर्ड से

एक सेगमेंट का चयन करें और प्रस्तुति को सेट करें FullScreen
यहाँ छवि विवरण दर्ज करें

5- झूलना

extension UIViewController {

  static func swizzlePresent() {

    let orginalSelector = #selector(present(_: animated: completion:))
    let swizzledSelector = #selector(swizzledPresent)

    guard let orginalMethod = class_getInstanceMethod(self, orginalSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else{return}

    let didAddMethod = class_addMethod(self,
                                       orginalSelector,
                                       method_getImplementation(swizzledMethod),
                                       method_getTypeEncoding(swizzledMethod))

    if didAddMethod {
      class_replaceMethod(self,
                          swizzledSelector,
                          method_getImplementation(orginalMethod),
                          method_getTypeEncoding(orginalMethod))
    } else {
      method_exchangeImplementations(orginalMethod, swizzledMethod)
    }

  }

  @objc
  private func swizzledPresent(_ viewControllerToPresent: UIViewController,
                               animated flag: Bool,
                               completion: (() -> Void)? = nil) {
    if #available(iOS 13.0, *) {
      if viewControllerToPresent.modalPresentationStyle == .automatic {
        viewControllerToPresent.modalPresentationStyle = .fullScreen
      }
    }
    swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
   }
}

उपयोग:
अपने में AppDelegateअंदर application(_ application: didFinishLaunchingWithOptions)इस पंक्ति जोड़ें:

UIViewController.swizzlePresent()

इस तरह से आपको किसी भी कॉल पर कोई बदलाव करने की आवश्यकता नहीं है, क्योंकि हम रनटाइम में वर्तमान पद्धति को लागू कर रहे हैं।
यदि आपको यह जानना आवश्यक है कि आप क्या कर रहे हैं, तो आप इस लिंक को देख सकते हैं: https://nshipster.com/swift-objc-runtion/


मेरे पास मेरे प्रोजेक्ट में कई व्यू-कंट्रोलर हैं, लेकिन बेस क्लास नहीं है, मैं नहीं चाहता कि आपके पास कोड में न्यूनतम बदलाव के साथ कोई समाधान हो
गुरु

मैंने स्विज़लिंग का उपयोग किया, लेकिन मैंने .pageSheet को शर्त में जोड़ दिया .... अगर viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
क्रैश

स्टेटस बार छुपा रहा है जब मैं एप्लाइड सॉल्यूशन नं १ जोड़ता हूं
गणेश पवार

4
स्विज़लिंग एक ऐसा समाधान है जिसने थोड़ी देर के लिए बहुत अच्छा काम किया। हालाँकि, जब कुछ बाहरी sdks जैसे कि FacebookLogin (आज की तुलना में 5.8) और GoogleSignin का उपयोग करते हुए, मैंने देखा है कि यह विधि उन प्रवाह को तोड़ती है: हमें iPad पर एक सफेद स्क्रीन मिलती है। यह संभवत: इस तथ्य के कारण है कि वे अपनी स्वैग्लिंग पद्धति का उपयोग करते हैं
ताओ-

39

मैंने ios 13 के लिए स्विज़लिंग का उपयोग किया

import Foundation
import UIKit

private func _swizzling(forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector),
       let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIViewController {

    static let preventPageSheetPresentation: Void = {
        if #available(iOS 13, *) {
            _swizzling(forClass: UIViewController.self,
                       originalSelector: #selector(present(_: animated: completion:)),
                       swizzledSelector: #selector(_swizzledPresent(_: animated: completion:)))
        }
    }()

    @available(iOS 13.0, *)
    @objc private func _swizzledPresent(_ viewControllerToPresent: UIViewController,
                                        animated flag: Bool,
                                        completion: (() -> Void)? = nil) {
        if viewControllerToPresent.modalPresentationStyle == .pageSheet
                   || viewControllerToPresent.modalPresentationStyle == .automatic {
            viewControllerToPresent.modalPresentationStyle = .fullScreen
        }
        _swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
    }
}

तो यह डाल दिया

UIViewController.preventPageSheetPresentation

कहीं

उदाहरण के लिए AppDelegate में

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
यदि आपके पास कई मोडल हैं तो सबसे आसान समाधान।
रायसल कालीकट

कहीं का मतलब है, किस फ़ाइल में या पूरे प्रोजेक्ट में कहां है
यतेंद्र

कहीं न कहीं, मैं इसे एपिडिएट में डाल देता हूं, static letयह आलसी है, आपको इसे एक बार गणना करने के लिए पढ़ना होगा, आलसी संस्करण की गणना सिर्फ एक बार की जाएगी, मैं इसे एक बार गारंटी देने के लिए उपयोग करता हूं कि स्विज़लिंग को एक बार कहा जाता है
मैक्सिमे

37

उद्देश्य-सी उपयोगकर्ताओं के लिए

बस इस कोड का उपयोग करें

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

या यदि आप इसे विशेष रूप से iOS 13.0 में जोड़ना चाहते हैं तो उपयोग करें

 if (@available(iOS 13.0, *)) {
     [vc setModalPresentationStyle: UIModalPresentationFullScreen];
 } else {
     // Fallback on earlier versions
 }

2
यह पहले के आईओएस संस्करण पर भी काम करता है, लेकिन इसका जवाब अच्छा है
कैटलिन

4
UIModalPresentationFullScreen iOS 3.2+ के साथ काम करता है। तो अगर कोई और शर्त जोड़ने की जरूरत नहीं है।
फ्लेम 3

2
केवल iOS 13.1.2 में कुछ कारणों के लिए ओबज-सी कक्षाओं में यह काम नहीं कर रहा है और modalPresentationStyle केवल एक पेजशीट प्रदर्शित कर रहा है। क्या यह किसी और के लिए हो रहा है?
Sevy11

@ Sevy11 मैंने iOS 13.1.2 में अपडेट नहीं किया है, लेकिन 13.1 पर ठीक काम कर रहा है
9to5ios

hi @ Sevy11 में मैंने अपना iOS 13.1.2 अपडेट किया है और इसका काम ठीक है, कृपया अपने अंत में देखें
9to5ios

36

एक लाइन:

modalPresentationStyleनेविगेशनकंट्रोलर पर सेट किया जाना आवश्यक है है जिसे प्रस्तुत किया जा रहा है


iOS 13 और नीचे iOS वर्जन फुलस्क्रीन के साथ overCurrentContext और navigationController

परीक्षण कोड

let controller = UIViewController()
let navigationController = UINavigationController(rootViewController: controller)
navigationController.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(navigationController, animated: true, completion: nil)

modalPresentationStyle को नेविगेशनकंट्रोलर पर सेट करने की आवश्यकता है ।


एक स्पष्टीकरण: एक नेविगेशनकंट्रोलर से व्यूकंट्रोलर को प्रस्तुत करने के लिए मोडलप्रेशनेंटेशन को संभालने की जरूरत नहीं है, जिसे नेविगेशनकंट्रोलर पर सेट किया जाना है। इसके बजाय, यह दृश्य नियंत्रक पर प्रस्तुत किया जा रहा है। हालाँकि, यदि आप एक नैविगेशनकंट्रोलर प्रस्तुत कर रहे हैं, तो 'modalPresentationStyle' प्रॉपर्टी को नैविगेशनकंट्रोलर पर सेट किया जाना चाहिए, न कि एम्बेडेड व्यू कॉन्ट्रोलर पर। यह दृष्टिकोण iOS 13.3, Xcode 11.3 काम करता है। देखिए योगेश भरते का जवाब
वोमबल

@ प्रकृतिक सोढ़ा इस पर कोई मदद? stackoverflow.com/questions/61429600/…
डेविड

इस पर कोई मदद @Womble stackoverflow.com/questions/61429600/...
डेविड

25

एक संकेत के रूप में: यदि आप वर्तमान को कॉल करते हैं, ViewControllerजो NavigationControllerआपके अंदर एम्बेडेड है, तो आपको इसे सेट करना NavigationControllerहोगा.fullScreen वीसी न कि।

आप इसे @davidbates की तरह कर सकते हैं या आप इसे प्रोग्रामेटिक रूप से (@pascalbros की तरह) कर सकते हैं।

एक उदाहरण परिदृश्य:

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

    //BaseNavigationController: UINavigationController {}
    let baseNavigationController = storyboard!.instantiateViewController(withIdentifier: "BaseNavigationController")
    var navigationController = UINavigationController(rootViewController: baseNavigationController)
    navigationController.modalPresentationStyle = .fullScreen
    navigationController.topViewController as? LoginViewController
    self.present(navigationViewController, animated: true, completion: nil)

19

मुझे दोनों करने की जरूरत थी:

  1. पूर्ण स्क्रीन के रूप में प्रस्तुति शैली सेट करें

    पूर्ण स्क्रीन

  2. ट्रांसलूसेंट नेविगेशन बार के रूप में टॉप बार सेट करें

शीश पट्टी


यह एक बहुत ही अजीब धारणा है कि नकली मेट्रिक्स में कुछ विकल्प आपको प्रस्तुति शैली को बदलने में मदद करते हैं
अलेक्जेंडर कुलबुखोव

14

modalPresentationStyleप्रस्तुत करने से पहले बदलें

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

यहां एक लाइन को कोड किए बिना एक आसान समाधान है।

  • स्टोरीबोर्ड में देखें नियंत्रक का चयन करें
  • विशेषता निरीक्षक का चयन करें
  • नीचे दिए गए चित्र के अनुसार प्रस्तुति "स्वचालित" से "फुलस्क्रीन" सेट करें

यह परिवर्तन iPad ऐप व्यवहार को अपेक्षित बनाता है अन्यथा स्क्रीन के केंद्र में पॉपअप के रूप में नई स्क्रीन प्रदर्शित हो रही है।

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


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

1
यह भी सुनिश्चित करें कि बाद के सेगमेंट "शो" हैं न कि "प्रेजेंट मोडली"
एंडी

ठीक है, इसलिए यह मेरे लिए काम करता है जब मैं अन्य विचारों को नियंत्रित करने के लिए टैब बार नियंत्रक का उपयोग करता हूं। हालाँकि, आपको वास्तविक 'टैब बार नियंत्रक' की प्रस्तुति को पूर्ण स्क्रीन पर सेट करने की आवश्यकता है क्योंकि यह अन्य सभी विचारों को नियंत्रित करता है।
चार्ली

12

यदि आपके पास एम्बेडेड नेविगेशन नियंत्रकों के साथ स्क्रीन के साथ एक UITabController है, तो आपको UITabController प्रस्तुति को FullScreen पर सेट करना होगा जैसा कि नीचे दिए गए चित्र में दिखाया गया है।

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


12

यहाँ उद्देश्य-सी के लिए समाधान है

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"ViewController"];

vc.modalPresentationStyle = UIModalPresentationFullScreen;

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


8

यहाँ श्रेणियाँ का उपयोग करके ObjectiveC में फिक्स का मेरा संस्करण है। इस दृष्टिकोण के साथ आपके पास एक और स्पष्ट रूप से सेट होने तक डिफ़ॉल्ट UIModalPresentationStyleFullScreen व्यवहार होगा।

#import "UIViewController+Presentation.h"
#import "objc/runtime.h"

@implementation UIViewController (Presentation)

- (void)setModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    [self setPrivateModalPresentationStyle:modalPresentationStyle];
}

-(UIModalPresentationStyle)modalPresentationStyle {
    UIModalPresentationStyle style = [self privateModalPresentationStyle];
    if (style == NSNotFound) {
        return UIModalPresentationFullScreen;
    }
    return style;
}

- (void)setPrivateModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    NSNumber *styleNumber = [NSNumber numberWithInteger:modalPresentationStyle];
     objc_setAssociatedObject(self, @selector(privateModalPresentationStyle), styleNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIModalPresentationStyle)privateModalPresentationStyle {
    NSNumber *styleNumber = objc_getAssociatedObject(self, @selector(privateModalPresentationStyle));
    if (styleNumber == nil) {
        return NSNotFound;
    }
    return styleNumber.integerValue;
}

@end

क्या आपके पास .h फ़ाइल है?
पेड्रो गोज

@ पेड्रो गेस हाँ, लेकिन इसमें केवल श्रेणी की घोषणा शामिल है: `` @interface UIViewController (प्रस्तुति) @ेंड `` `
अलेक्जेंडर कुलबुखोव

7

अन्य सभी उत्तर पर्याप्त हैं, लेकिन हमारे जैसे बड़े प्रोजेक्ट के लिए और जहां कोड और स्टोरीबोर्ड दोनों में नेवीगेशन किए जा रहे हैं, यह काफी चुनौतीपूर्ण काम है।

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

उन लोगों के लिए जो स्टोरीबोर्ड का सक्रिय रूप से उपयोग कर रहे हैं। यह मेरी सलाह है: रेगेक्स का उपयोग करें।

निम्नलिखित प्रारूप पूर्ण स्क्रीन पृष्ठों के लिए अच्छा नहीं है:

<segue destination="Bof-iQ-svK" kind="presentation" identifier="importSystem" modalPresentationStyle="fullScreen" id="bfy-FP-mlc"/>

निम्न प्रारूप पूर्ण स्क्रीन पृष्ठों के लिए अच्छा है:

<segue destination="7DQ-Kj-yFD" kind="presentation" identifier="defaultLandingToSystemInfo" modalPresentationStyle="fullScreen" id="Mjn-t2-yxe"/>

VS CODE के साथ संगत regex सभी पुरानी शैली के पन्नों को नई शैली के पन्नों में बदल देगा। यदि आप अन्य रेगेक्स इंजन / पाठ संपादकों का उपयोग कर रहे हैं, तो आपको विशेष वर्णों से बचने की आवश्यकता हो सकती है।

रेगेक्स खोजें

<segue destination="(.*)"\s* kind="show" identifier="(.*)" id="(.*)"/>

रेगेक्स को बदलें

<segue destination="$1" kind="presentation" identifier="$2" modalPresentationStyle="fullScreen" id="$3"/>

4

प्रारंभ में, डिफ़ॉल्ट मान fullscreenmodalPresentationStyle के लिए है, लेकिन iOS 13 में इसके परिवर्तन UIModalPresentationStyle.automatic

आप बदलना होगा आप पूर्ण स्क्रीन दृश्य नियंत्रक बनाना चाहते हैं modalPresentationStyleकरने के लिए fullScreen

देखें UIModalPresentationStyle सेब प्रलेखन अधिक जानकारी के लिए और उल्लेख दिशा निर्देशों इंटरफ़ेस सेब मानव जहां जो साधन का उपयोग करना चाहिए के लिए।


यह उन स्थितियों के लिए iOS 13.3, Xcode 11.3 के रूप में सही उत्तर है, जहां आप नेविगेशनकंट्रोलर से व्यू कॉन्ट्रोलर को प्रस्तुत करना चाहते हैं। .OverFullScreen का एक modalPresentationStyle भी काम करता है। हालाँकि, यदि आप एक नेविगेशनकंट्रोलर प्रस्तुत कर रहे हैं, तो आपको नेविगेशनकंट्रोलर पर 'modalPresentationStyle' सेट करना होगा, न कि व्यूकंट्रोलर। चीयर्स।
वोमबल

3

आप आसानी से ऐसा कर सकते हैं अपने स्टोरीबोर्ड को स्रोत कोड के रूप में खोलें और kind="presentation"सभी सीग टैग में तरह = प्रस्तुति के लिए एक अतिरिक्त विशेषता जोड़ेंmodalPresentationStyle="fullScreen"


2
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)

// यदि आप इस पर खारिज करने के लिए स्वाइप को निष्क्रिय करना चाहते हैं, तो लाइन जोड़ें

Obj.isModalInPresentation = true

अधिक जानकारी के लिए Apple दस्तावेज़ की जाँच करें ।


2

मैंने इसे विधि स्विज़लिंग (स्विफ्ट 4.2) का उपयोग करके हासिल किया:

एक UIViewController विस्तार बनाने के लिए निम्नानुसार है

extension UIViewController {

    @objc private func swizzled_presentstyle(_ viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?) {

        if #available(iOS 13.0, *) {
            if viewControllerToPresent.modalPresentationStyle == .automatic || viewControllerToPresent.modalPresentationStyle == .pageSheet {
                viewControllerToPresent.modalPresentationStyle = .fullScreen
            }
        }

        self.swizzled_presentstyle(viewControllerToPresent, animated: animated, completion: completion)
    }

     static func setPresentationStyle_fullScreen() {

        let instance: UIViewController = UIViewController()
        let aClass: AnyClass! = object_getClass(instance)

        let originalSelector = #selector(UIViewController.present(_:animated:completion:))
        let swizzledSelector = #selector(UIViewController.swizzled_presentstyle(_:animated:completion:))

        let originalMethod = class_getInstanceMethod(aClass, originalSelector)
        let swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector)
        if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
        method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

और AppDelegate में, आवेदन में: didFinishLaunchingWithOptions: कॉल करके स्विज़लिंग को आमंत्रित करें:

UIViewController.setPresentationStyle_fullScreen()

1

यह मेरे लिए काम किया:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


3
यह अन्य सभी मौजूदा उत्तरों के लिए कुछ नहीं जोड़ता है।
2

1

UIViewController के लिए एक श्रेणी बनाएं (UIViewController + PresentationStyle कहें)। इसमें निम्न कोड जोड़ें।

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}


@ डक्लेट यह एक महान अवलोकन है। तो संपत्ति को स्पष्ट रूप से सेट करने से समस्या हल हो जाएगी। UISearchController का उपयोग कर रहा है, तो कोई सरल समाधान।
गोविंद

0

एक वैकल्पिक तरीका यह है कि आपके ऐप में आपका खुद का आधार व्यूकंट्रोलर घटक है, और केवल एक मूल सेटअप के साथ निर्दिष्ट और आवश्यक इनिशियलाइज़र को लागू करना है, जैसे कुछ निम्नलिखित:

class MyBaseViewController: UIViewController {

//MARK: Initialisers

/// Alternative initializer which allows you to set the modal presentation syle
/// - Parameter modalStyle: the presentation style to be used
init(with modalStyle:UIModalPresentationStyle) {
    super.init(nibName: nil, bundle: nil)
    self.setup(modalStyle: modalStyle)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

//MARK: Private

/// Setup the view
///
/// - Parameter modalStyle: indicates which modal presentation style to be used
/// - Parameter modalPresentation: default true, it prevent modally presented view to be dismissible with the default swipe gesture
private func setup(modalStyle:UIModalPresentationStyle, modalPresentation:Bool = true){
    if #available(iOS 13, *) {
        self.modalPresentationStyle = modalStyle
        self.isModalInPresentation = modalPresentation
    }
}

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

IOS 13.1 और iOS 12.4 पर Xcode 11.1 पर परीक्षण किया गया

आशा है ये मदद करेगा


0

मुझे अब फुलस्क्रीन प्रस्तुत नहीं करने वाले वीडियो के साथ यह समस्या थी। इस लाइन को जोड़ा गया, जिसने दिन को बचाया :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
यह अन्य सभी मौजूदा उत्तरों के लिए कुछ नहीं जोड़ता है।
2

0

सबसे सरल समाधान जो मेरे लिए काम किया।

viewController.modalPresentationStyle = .fullScreen

3
यह अन्य सभी मौजूदा उत्तरों के लिए कुछ नहीं जोड़ता है।
2

0

यदि आप UINavigationController का उपयोग कर रहे हैं और एक ViewController को रूट व्यू कंट्रोलर के रूप में एम्बेड करते हैं, तो आप भी उसी मुद्दे के साथ उठेंगे। काबू पाने के लिए निम्न कोड का उपयोग करें।

let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen

0
class MyViewController: UIViewController {

    convenience init() {
        self.init(nibName:nil, bundle:nil)
        self.modalPresentationStyle = .fullScreen
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

self.modalPresentationStyle = .fullScreenप्रत्येक दृश्य नियंत्रक के लिए कॉल करने के बजाय , आप UIViewController को उप-वर्ग कर सकते हैं और बस MyViewControllerहर जगह उपयोग कर सकते हैं ।


-1

उपरोक्त उत्तर और सुझाव सही हैं, नीचे एक और संस्करण है, और प्रोग्रामेटिक रूप से उपयोग करने का कुशल तरीका है।

# 1 एक उविवि एक्सटेंशन बनाया गया

# 2 बनाया गया एक तरीका ()

//#1
extension UIViewController {

//#2
func presentLocal(_ viewControllerToPresent: UIViewController, animated flag: 
Bool, completion: (() -> Void)? = nil) {

//Reusing below 2 lines :-)
viewControllerToPresent.modalPresentationStyle = .overCurrentContext
self.present(viewControllerToPresent, animated: flag, completion: completion)

  }
}

नीचे के रूप में आमंत्रित

let vc = MyViewController()
let nc = UINavigationController(rootViewController: vc)
sourceView.presentLocal(nc, animated: true, completion: nil)

या

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.