İOS 13 tam ekranında modal sunma


468

İOS 13'te, sunulduğunda modal görünüm denetleyicisi için yeni bir davranış var.

Şimdi varsayılan olarak tam ekran değil ve aşağı kaydırmaya çalıştığımda, uygulama Görünüm Denetleyicisini otomatik olarak kapatıyor.

Bu davranışı nasıl önleyebilir ve eski tam ekran modsal vc'ye geri dönebilirim?

kalıcı davranış

Teşekkürler

Yanıtlar:


625

WWDC 2019 sırasında Birliğin Platformlar Durumunda belirtildiği gibi iOS 13 ile Apple yeni bir varsayılan kart sunumu başlattı. Tam ekranı zorlamak için aşağıdakileri açıkça belirtmeniz gerekir:

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

81
Bu varsayılan olarak uzun kalmak olmaz söyleyebilirim. fullScreenSeçenek kırılma UI değişiklikleri önlemek için varsayılan olmalıdır.
Jakub Truhlář

17
Buna güvenmem. Geçmişte, Apple, varsayılanları yalnızca geçerli SDK'ya bağlandıktan sonra etkin hale getirerek değiştirdi. Umarım önceki sürümlerle bağlantı kurarken eski davranışı elde ederiz .
DrMickeyLauer

11
İOS 13 simülatöründe çalışan Xcode-10 yerleşik uygulamalarının hala varsayılanı tam ekrana ayarladığını onaylayabilirim. @DrMickeyLauer'in dediği gibi, Xcode 11 ile inşa etmek uygulamayı yeni davranışa dahil ediyor. isModalInPresentationKaydırma hareketinin kapatılmasını engellemek için kullanın . Daha fazla bilgi için blog gönderime bakın: medium.com/@hacknicity/…
Geoff Hackworth

5
.OverFullScreen yerine .fullScreen kullanmanızı öneririm. .fullScreen yangınları viewWillAppear ve viewDidAppear, .overFullScreen bunu yapmaz
PiterPan

5
Zaman geçti ve .automaticstil (çoğu görünüm denetleyicisi için) .pageSheetstil olan varsayılan olarak yerleşti . Ancak, bazı sistem görünümü denetleyicileri bunu farklı bir stille eşleyebilir.
Jakub Truhlář

186

Birisi için yararlı olabilecek bir bilgi ekliyorum. Herhangi bir storyboard segue'iniz varsa, eski stile geri dönmek için, kind özelliğini Modally Sunumu ve Sunum özelliğini Tam Ekran olarak ayarlamanız gerekir .

resim açıklamasını buraya girin


2
Interface Builder'da isModalInPresentation'ı ayarlamanın bir yolu var mı?
Brad Thomas

Buna katılıyorum. En yüksek düzeydeki rahatsız edici görünüm (ler) için Sunu değerini değiştirin.
David

Bu benim için çalıştı çünkü ben var performSegue. Teşekkürler canım!
Blasanka

95

Bu sorunu açılış ekranından hemen sonra ilk görünümde yaşadım. Tanımlanmış bir segue veya mantık olmadığım için benim için düzeltme, sunumu burada gösterildiği gibi tam ekrandan tam ekrana geçirmekti:

fix_storyboard_presentation_default_behavior


2
Film şeridi aracılığıyla tek tek yerine tüm görünümler için bunu programlı olarak yapmanın bir yolu var mı?
The1993

@ The1993 Buna bir alternatif buldunuz mu?
Shobhit Puri

1
@ShobhitPuri Omreyh'in ilk çözümüne bir göz atın buradan stackoverflow.com/a/58255416/4323101
The1993

1
Vay be, bu sorunlarımın cevabıydı. Bahşiş için teşekkürler! Bunu da arayan diğerleri için, bu, uygulamayı arka plandan yeniden açtıktan sonra garip davranışların düzeltilmesidir. Uygulamamda, arka plandan açılış açılış ekranımı (ilk görünüm denetleyicisini) bir kart sunum stili olarak kaplar ve daha sonra buradan çıkan tüm seguelar tanımlanmış segue stilini kullanmak yerine çaprazlaşır. Uygulamayı kapatırsam iyi olur (ana sayfa düğmesine iki kez hafifçe vurun ve yukarı kaydırın, sonra yeniden açın), ancak ek başlatmalar bu garip davranışa neden olur. Tekrar teşekkürler!
Justin

92

Bunu yapmanın birden fazla yolu var ve bence her biri bir projeye sığabilir, ancak başka bir projeye uymayabilir, bu yüzden onları burada tutacağımı düşündüm belki başka biri farklı bir davaya koşacak.

1- Mevcut olanları geçersiz kıl

Varsa BaseViewController, present(_ viewControllerToPresent: animated flag: completion:)yöntemi geçersiz kılabilirsiniz .

class BaseViewController: UIViewController {

  // ....

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

  // ....
}

Bu yöntemi kullanarak, herhangi bir presentçağrıda herhangi bir değişiklik yapmanız gerekmez , çünkü presentyöntemi aştık .

2- Bir uzantı:

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

Kullanımı:

presentInFullScreen(viewController, animated: true)

3- Bir UIViewController için

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

4- Film şeridinden

Bir segue seçin ve sunuyu olarak ayarlayın FullScreen.
resim açıklamasını buraya girin

5- Kıvrılma

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)
   }
}

Kullanımı:
sizin de AppDelegateiçeriden application(_ application: didFinishLaunchingWithOptions)bu satırı ekleyin:

UIViewController.swizzlePresent()

Bu yöntemle, mevcut yöntem uygulamasını çalışma zamanında değiştirdiğimizden, mevcut çağrılarda herhangi bir değişiklik yapmanız gerekmez.
Neyin değiştiğini bilmeniz gerekiyorsa, bu bağlantıyı kontrol edebilirsiniz: https://nshipster.com/swift-objc-runtime/


Projemde birçok viewControllers var, ancak temel sınıf yok, swizzling istemiyorum Kodda minimum değişikliklerle bunun için herhangi bir çözümünüz var mı
guru

Ben swizzling kullandım, ancak koşul .... .Sayfa sayfasını eklediyse viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
Crash

1 numaralı uygulamalı çözüm eklediğimde durum çubuğu gizleniyor
Ganesh Pawar

4
Swizzling, bir süre harika çalışan bir çözümdür. Ancak, FacebookLogin (bugün itibariyle 5.8) ve GoogleSignin gibi bazı harici SDD'leri kullanırken, bu yöntemin bu akışları bozduğunu fark ettim: iPad'de beyaz bir ekran elde ediyoruz. Bu muhtemelen kendi swizzling yöntemlerini kullanmaları gerçeğinden kaynaklanmaktadır
Tao-Nhan Nguyen

39

IOS 13 için swizzling kullandım

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)
    }
}

o zaman bunu koy

UIViewController.preventPageSheetPresentation

bir yerde

örneğin AppDelegate'te

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

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
Birden fazla modeliniz varsa en kolay çözüm.
Raisal Calicut

bir yerde anlamı, hangi dosyada veya tüm projede nerede
Yatendra

bir yerde, ben appdelegate static lettembel koymak , sadece bir kez hesaplanan, lazy var hesaplanmış izin için okumak zorunda, ben bir kez denilen swizzling garanti için kullanın
Maxime

38

Objective-C kullanıcıları için

Sadece bu kodu kullanın

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Veya özellikle iOS 13.0'a eklemek istiyorsanız şunu kullanın:

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

2
bu daha önceki ios sürümünde de çalışıyor, ancak cevap iyi
Catalin

4
UIModalPresentationFullScreen, iOS 3.2 ve sonraki sürümleriyle çalışır. Bu yüzden başka bir koşul eklemeniz gerekmez.
flame3

2
Bazı nedenlerden dolayı iOS 13.1.2'de yalnızca Obj-c sınıflarında bu çalışmıyor ve modalPresentationStyle yalnızca bir pageSheet görüntülüyor. Bu başka biri için mi oluyor?
Sevy11

@ Sevy11 iOS 13.1.2 sürümüne güncelleme yapmadım ancak 13.1
9to5ios

hi @ Sevy11 iOS 13.1.2 sürümümü ve iyi çalıştığını güncelledim, lütfen sonunda kontrol edin
9to5ios

37

Bir Astar:

modalPresentationStylesunulmakta olan navigationController üzerinde ayarlanması gerekmektedir .


iOS 13 ve altı iOS sürümü fullScreen overCurrentContextve ile navigationController

Test Edilen Kod

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

modalPresentationStyle , navigationController öğesinde ayarlanmalıdır .


Bir açıklama: bir navigationController öğesinden bir viewController sunmak, navigationController üzerinde ayarlamak için modalPresentationStyle öğesine gerek duymaz. Bunun yerine, sunulan viewController üzerinde ayarlanır. Ancak, bir navigationController sunuyorsanız, gömülü viewController üzerinde değil, 'modalPresentationStyle' özelliğinin navigationController üzerinde ayarlanması gerekir. Bu yaklaşım iOS 13.3, Xcode 11.3'te çalışır. Yogesh Bharate'in cevabına bakın.
Womble

@Pratik Sodha. Bu konuda herhangi bir yardım? stackoverflow.com/questions/61429600/…
david


25

Bir ipucu olarak: Eğer bir mevcut çağırırsanız ViewControllerbir iç gömülü olduğu NavigationControllerSahip ayarlamak NavigationControlleriçin .fullScreenVC değil.

Bunu @davidbates gibi yapabilir veya programlı olarak (@pascalbros gibi) yapabilirsiniz.

Örnek bir senaryo:

resim açıklamasını buraya girin

    //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)

22

Her ikisini de yapmam gerekiyordu:

  1. Sunum stilini Tam ekran olarak ayarla

    Tam ekran

  2. Üst çubuğu Yarı Saydam Gezinme Çubuğu olarak ayarla

Üst çubuk


Simüle
Edilmiş

14

Sunmadan modalPresentationStyleönce değiştir

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

İşte tek bir satır kodlamadan kolay bir çözüm.

  • Film Şeridinde Denetleyiciyi Görüntüle'yi seçin
  • Özellik Denetçisi seçin
  • "Otomatik" sunumunu aşağıdaki resme göre "FullScreen" olarak ayarlayın

Bu değişiklik iPad uygulamasının davranışını beklendiği gibi yapar, aksi takdirde yeni ekran bir açılır pencere olarak ekranın ortasında görüntülenir.

resim açıklamasını buraya girin


Burada anahtar olan şey, resmin gösterdiği şey olan NavigationController'da yaptığınız, ancak metnin bu şekilde söylemediğini düşünüyorum.
Andy Weinstein

1
Ayrıca sonraki segues "Modally Present" değil "Show" olduğundan emin olun
Andy Weinstein

Tamam, bu yüzden diğer görünümleri kontrol etmek için bir sekme çubuğu denetleyicisi kullandığımda bu benim için çalışıyor gibi görünüyor. Ancak, diğer 'görünümleri kontrol ettiği için gerçek' Sekme Çubuğu Denetleyicisi'nin Sunumunu Tam Ekran olarak ayarlamanız gerekir.
Charlie

12

Gömülü Gezinme Denetleyicileri olan Ekranlı bir UITabController'ınız varsa, aşağıdaki resimde gösterildiği gibi UITabController Sunumunu FullScreen olarak ayarlamanız gerekir

resim açıklamasını buraya girin


12

İşte Objective-C için çözüm

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

vc.modalPresentationStyle = UIModalPresentationFullScreen;

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

11

İOS 13 ve Swift 5.x için son sürüm

let vc = ViewController(nibName: "ViewController", bundle: nil)

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true, completion: nil)

9

İşte ObjectiveC Kategoriler kullanarak düzeltme sürümü. Bu yaklaşımla, açıkça ayarlanana kadar varsayılan UIModalPresentationStyleFullScreen davranışına sahip olursunuz.

#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 dosyanız var mı?
Pedro Góes

@ PedroGóes evet, ancak sadece kategori beyanından oluşur: `` @interface UIViewController (Sunum) @end ``
Alexander Kulabukhov

Film şeridinizdeki her denetleyiciyle uğraşmak istemiyorsanız bunu kullanın! Zaman tasarrufu, teşekkürler!
AnthoPak

7

Diğer tüm cevaplar yeterlidir, ancak bizimki gibi büyük bir proje için ve hem kodda hem de film şeridinde gezinmelerin yapıldığı, oldukça göz korkutucu bir görevdir.

resim açıklamasını buraya girin

Storyboard'u aktif olarak kullananlar için. Bu benim tavsiyem: Regex kullanın.

Aşağıdaki biçim, tam ekran sayfaları için iyi değildir:

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

Aşağıdaki biçim tam ekran sayfaları için iyidir:

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

VS CODE ile uyumlu aşağıdaki normal ifade, tüm Eski Stil sayfalarını yeni stil sayfalarına dönüştürecektir. Başka regex motorları / metin editörleri kullanıyorsanız özel karakterlerden kaçmanız gerekebilir.

Regex'te Ara

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

Normal İfade Değiştir

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

4

Başlangıçta, varsayılan değerdir fullscreenmodalPresentationStyle için değil de iOS 13 olan değişiklikler UIModalPresentationStyle.automatic.

Tam ekran görünüm denetleyicisini yapmak istiyorsanız için ayarını değiştirmeniz modalPresentationStylegerekir fullScreen.

Daha fazla ayrıntı için UIModalPresentationStyle elma belgelerine bakın ve hangi modaliteyi nerede kullanmanız gerektiğine dair elma insan arayüzü yönergelerine bakın .


Bu, bir navigationController'dan bir viewController sunmak istediğiniz durumlar için iOS 13.3, Xcode 11.3'ten itibaren doğru yanıttır. ModalPresentationStyle .overFullScreen de çalışır. Ancak, bir navigationController sunuyorsanız, viewController öğesini değil, navigationController üzerinde 'modalPresentationStyle' ayarlamanız gerekir. Şerefe.
Womble

3

Bunu kolayca yapabilirsiniz kind="presentation"Görsel senaryo taslağınızı kaynak kodu olarak açın ve kind = sunum ile tüm seague etiketinde ekstra bir özellik ekleyin.modalPresentationStyle="fullScreen"


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

// kapatmak için hızlıca kaydırma özelliğini devre dışı bırakmak istiyorsanız satır ekleyin

Obj.isModalInPresentation = true

Kontrol Elma Belgesi fazla bilgi için.


2

Ben yöntem swizzling (Swift 4.2) kullanarak elde:

Aşağıdaki gibi bir UIViewController uzantısı oluşturmak için

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)
        }
    }
}

ve AppDelegate'te, uygulamada: didFinishLaunchingWithOptions: çağrı kodunu arayarak çağırın:

UIViewController.setPresentationStyle_fullScreen()

1

Bu benim için çalıştı:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


3
Bu, mevcut diğer tüm cevaplara hiçbir şey katmaz.
rmaddy

1

UIViewController için bir kategori oluşturun (UIViewController + PresentationStyle diyelim). Aşağıdaki kodu ekleyin.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}

bu UISearchController + çökmesini hata ayıklamak için bazı zor tetikleyecektir
dklt

@dklt Bu harika bir gözlem. Bu nedenle özelliği açıkça ayarlamak sorunu çözecektir. UISearchController kullanıyorsa daha basit çözüm yoktur.
Govind

0

alternatif bir yaklaşım, uygulamanızda kendi temel viewcontroller bileşenine sahip olmak ve yalnızca belirtilen ve gerekli başlatıcıları aşağıdaki gibi temel bir kurulumla uygulamaktır:

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
    }
}

NOT : Görünüm denetleyiciniz gerçekten modal olarak sunulan bir gezinme denetleyicisinde bulunuyorsa, gezinme denetleyicisi soruna aynı şekilde yaklaşmalıdır (yani, özel gezinti denetleyicisi bileşeninizin aynı şekilde özelleştirilmesi)

İOS 13.1 ve iOS 12.4'te Xcode 11.1'de test edildi

Umarım yardımcı olur


0

Artık tam ekran sunmayan bir video ile bu sorunu yaşadım. Günü kurtaran bu satır eklendi :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
Bu, mevcut diğer tüm cevaplara hiçbir şey katmaz.
rmaddy

0

Benim için çalışan en basit çözüm.

viewController.modalPresentationStyle = .fullScreen

3
Bu, mevcut diğer tüm cevaplara hiçbir şey katmaz.
rmaddy

0

Bir UINavigationController kullanıyorsanız ve bir ViewController'ı kök görünüm denetleyicisi olarak gömdüyseniz, aynı sorunla yükselirsiniz. Üstesinden gelmek için aşağıdaki kodu kullanın.

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 = .fullScreenHer görünüm denetleyicisi için çağrı yapmak yerine , UIViewController alt sınıfını kullanabilir ve MyViewControllerher yerde kullanabilirsiniz .


-1

Yukarıdaki cevaplar ve öneriler doğrudur, aşağıda başka bir versiyon ve programlı olarak verimli bir şekilde kullanılmaktadır.

# 1 UIView Uzantısı Oluşturuldu

# 2 Bir Yöntem Oluşturuldu ()

//#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)

  }
}

Aşağıdaki gibi çağrılıyor

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

VEYA

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.