Menyajikan modal dalam layar penuh iOS 13

465

Di iOS 13 ada perilaku baru untuk pengontrol tampilan modal saat disajikan.

Sekarang ini bukan layar penuh secara default dan ketika saya mencoba untuk meluncur ke bawah, aplikasi hanya mengabaikan View Controller secara otomatis.

Bagaimana saya bisa mencegah perilaku ini dan kembali ke modal fullscreen lama vc?

perilaku modal

Terima kasih

pascalbros
sumber

Jawaban:

622

Dengan iOS 13, sebagaimana dinyatakan dalam Platforms of Union selama WWDC 2019, Apple memperkenalkan presentasi kartu default baru. Untuk memaksa layar penuh Anda harus menentukannya secara eksplisit dengan:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)
pascalbros
sumber
81
Saya akan mengatakan ini tidak akan tinggal selama standar. The fullScreenpilihan harus menjadi default untuk mencegah perubahan UI melanggar.
Jakub Truhlář
17
Saya tidak akan mengandalkan itu. Di masa lalu, Apple sering mengubah default hanya menjadi aktif setelah Anda menautkan dengan SDK saat ini. Mudah - mudahan kami akan mendapatkan perilaku lama saat menautkan ke versi sebelumnya.
DrMickeyLauer
11
Saya dapat mengonfirmasi bahwa aplikasi bawaan Xcode-10 berjalan pada simulator iOS 13 yang masih default ke layar penuh. Seperti @DrMickeyLauer berkata, membangun dengan Xcode 11 memilih aplikasi untuk perilaku baru. Gunakan isModalInPresentationuntuk memblokir gerakan menggesek agar tidak menghilang. Lihat posting blog saya untuk lebih jelasnya: medium.com/@hacknicity/…
Geoff Hackworth
5
Saya merekomendasikan untuk menggunakan .fullScreen daripada .overFullScreen. .fullScreen mengaktifkan viewWillAppear dan viewDidAppear, .overFullScreen tidak melakukan itu
PiterPan
5
Waktu telah berlalu dan .automaticgaya telah ditetapkan sebagai gaya default, yaitu gaya (untuk sebagian besar pengontrol tampilan) .pageSheet. Namun beberapa pengontrol tampilan sistem dapat memetakannya ke gaya yang berbeda.
Jakub Truhlář
186

Saya menambahkan informasi yang dapat bermanfaat bagi seseorang. Jika Anda memiliki segue papan cerita, untuk kembali ke gaya lama, Anda perlu mengatur properti jenis ke Present Modally dan Presentation properti ke Layar Penuh .

masukkan deskripsi gambar di sini

Alessandro
sumber
2
Apakah ada cara di Interface Builder untuk mengatur isModalInPresentation?
Brad Thomas
Setuju dengan ini. Ubah nilai Presentasi untuk tampilan pelanggaran tingkat tertinggi.
David
Ini yang bekerja untuk saya karena saya punya performSegue. Terima kasih sayang!
Blasanka
95

Saya memiliki masalah ini pada tampilan awal setelah layar peluncuran. Perbaikan untuk saya karena saya tidak memiliki segue atau logika yang ditentukan adalah untuk mengubah presentasi dari otomatis ke layar penuh seperti yang ditunjukkan di sini:

fix_storyboard_presentation_default_behavior

davidbates
sumber
2
Apakah ada cara untuk melakukan ini secara terprogram untuk semua tampilan, bukan satu per satu melalui storyboard?
The1993
@ The1993 Apakah Anda menemukan alternatif untuk itu?
Shobhit Puri
1
@ShobhitPuri Lihatlah solusi pertama oleh Omreyh di sini stackoverflow.com/a/58255416/4323101
The1993
1
Wow, ini jawaban untuk masalah saya. Terima kasih atas tipnya! Untuk orang lain yang melihat ini juga, ini adalah perbaikan untuk perilaku aneh setelah membuka kembali aplikasi dari latar belakang. Dalam aplikasi saya, membuka dari latar belakang akan overlay layar splash saya (pengendali tampilan awal) sebagai gaya presentasi kartu dan kemudian setiap segmen dari sini keluar akan lintas-memudar bukannya menggunakan gaya segue yang saya tetapkan. Akan baik-baik saja jika saya menutup aplikasi (ketuk dua kali tombol home dan geser ke atas, lalu buka kembali) tetapi setiap peluncuran tambahan akan menyebabkan perilaku aneh ini. Terima kasih lagi!
Justin
92

Ada banyak cara untuk melakukan itu, dan saya pikir masing-masing bisa cocok untuk satu proyek tetapi tidak yang lain, jadi saya pikir saya akan menyimpannya di sini mungkin orang lain akan lari ke kasus yang berbeda.

1- Timpa yang ada

Jika sudah, BaseViewControllerAnda dapat mengganti present(_ viewControllerToPresent: animated flag: completion:)metode.

class BaseViewController: UIViewController {

  // ....

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

  // ....
}

Dengan menggunakan cara ini Anda tidak perlu melakukan perubahan apa pun pada presentpanggilan apa pun , karena kami hanya mengesampingkan presentmetode ini.

2- Perpanjangan:

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

Pemakaian:

presentInFullScreen(viewController, animated: true)

3- Untuk satu UIViewController

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

4- Dari Storyboard

Pilih segue dan atur presentasi ke FullScreen.
masukkan deskripsi gambar di sini

5-swizzling

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

Penggunaan:
Di AppDelegatebagian dalam Anda application(_ application: didFinishLaunchingWithOptions)tambahkan baris ini:

UIViewController.swizzlePresent()

Dengan menggunakan cara ini Anda tidak perlu melakukan perubahan apa pun pada panggilan saat ini, karena kami mengganti implementasi metode saat ini di runtime.
Jika Anda perlu tahu apa yang membingungkan Anda dapat memeriksa tautan ini: https://nshipster.com/swift-objc-runtime/

Abedalkareem Omreyh
sumber
Saya memiliki banyak viewControllers di proyek saya, tetapi tidak memiliki kelas dasar, saya tidak ingin bingung apakah Anda punya solusi untuk itu dengan perubahan kode yang minimum
guru
Saya menggunakan swizzling, tetapi saya menambahkan .pageSheet ke kondisi .... jika viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
Crash
status bar bersembunyi ketika saya menambahkan solusi terapan no 1.
Ganesh Pawar
4
Swizzling adalah solusi yang bekerja sangat baik untuk sementara waktu. Namun, ketika menggunakan beberapa sdks eksternal seperti FacebookLogin (5,8 pada hari ini) dan GoogleSignin, saya perhatikan bahwa metode ini memecah arus: kita mendapatkan layar putih di iPad. Ini mungkin karena fakta bahwa mereka menggunakan metode swizzling mereka sendiri
Tao-Nhan Nguyen
39

Saya menggunakan swizzling untuk 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)
    }
}

lalu taruh ini

UIViewController.preventPageSheetPresentation

suatu tempat

misalnya di AppDelegate

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

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}
Maxime Ashurov
sumber
3
Solusi termudah jika Anda memiliki banyak modals.
Raisal Calicut
di suatu tempat berarti, berarti di mana file atau di mana dalam seluruh proyek
Yatendra
di suatu tempat Anda, saya taruh di appdelegate static letmalas, Anda harus membacanya untuk membiarkannya dihitung, lazy var dihitung hanya sekali, saya menggunakannya untuk memiliki jaminan bahwa swizzling disebut sekali
Maxime Ashurov
37

Untuk pengguna Objective-C

Gunakan saja kode ini

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Atau jika Anda ingin menambahkannya di iOS 13.0 kemudian gunakan

 if (@available(iOS 13.0, *)) {
     [vc setModalPresentationStyle: UIModalPresentationFullScreen];
 } else {
     // Fallback on earlier versions
 }
9to5ios
sumber
2
ini bekerja pada versi ios sebelumnya juga, tetapi jawabannya baik
Catalin
4
UIModalPresentationFullScreen berfungsi dengan iOS 3.2+. Jadi tidak perlu menambahkan kalau ada syaratnya.
flame3
2
Untuk beberapa alasan di iOS 13.1.2 hanya di kelas Obj-c ini tidak berfungsi dan modalPresentationStyle hanya menampilkan pageSheet. Apakah ini terjadi pada orang lain?
Sevy11
@ Sevy11 Saya belum memperbarui ke iOS 13.1.2 tetapi bekerja dengan baik di 13.1
9to5ios
hai @ Sevy11 Saya telah memperbarui iOS 13.1.2 saya dan berfungsi dengan baik, silakan periksa di pihak Anda
9to5ios
37

Satu Liner:

modalPresentationStylediperlukan untuk diatur pada navigationController yang sedang disajikan .


iOS 13 dan versi di bawah iOS fullScreen dengan overCurrentContextdan navigationController

Kode yang Diuji

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

modalPresentationStyle perlu diatur di navigationController .

Pratik Sodha
sumber
Klarifikasi: menyajikan viewController dari navigationController tidak perlu modalPresentationStyle untuk ditetapkan pada navigationController. Sebaliknya, ini diatur pada viewController yang disajikan. Namun, jika Anda menghadirkan navigationController, maka properti 'modalPresentationStyle' harus ditetapkan pada navigationController, bukan viewController tertanam. Pendekatan ini berfungsi iOS 13.3, Xcode 11.3. Lihat jawaban Yogesh Bharate.
Womble
@Pratik Sodha. Ada bantuan untuk ini? stackoverflow.com/questions/61429600/…
david
@Womble Setiap bantuan pada stackoverflow.com/questions/61429600/…
david
25

Sebagai petunjuk: Jika Anda memanggil hadiah ViewControlleryang tertanam di dalamnya, NavigationControllerAnda harus menyetel NavigationControllerke.fullScreen dan bukan VC.

Anda dapat melakukan ini seperti @davidbates atau Anda melakukannya secara terprogram (seperti @pascalbros).

Contoh skenario:

masukkan deskripsi gambar di sini

    //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)
kuzdu
sumber
22

Saya perlu melakukan keduanya:

  1. Tetapkan gaya presentasi sebagai Layar penuh

    Layar penuh

  2. Setel bilah Top sebagai Bilah Navigasi Tembus

Bilah atas

vedrano
sumber
Ini asumsi yang sangat aneh bahwa beberapa opsi dalam Simulasi Metrik membantu Anda mengubah gaya presentasi
Alexander Kulabukhov
14

Ubah modalPresentationStylesebelum presentasi

vc.modalPresentationStyle = UIModalPresentationFullScreen;
MAMN84
sumber
13

Ini adalah solusi mudah tanpa mengkode satu baris pun.

  • Pilih View Controller di Storyboard
  • Pilih atribut Inspektur
  • Atur presentasi "Otomatis" menjadi "Layar Penuh" seperti gambar di bawah ini

Perubahan ini membuat perilaku aplikasi iPad seperti yang diharapkan jika tidak, layar baru ditampilkan di tengah layar sebagai popup.

masukkan deskripsi gambar di sini

Mahesh Cheliya
sumber
Saya pikir apa yang menjadi kunci di sini adalah Anda melakukan ini pada NavigationController, yang merupakan gambar yang ditampilkan tetapi teks tidak mengatakannya dengan cara ini.
Andy Weinstein
1
juga memastikan segues berikutnya adalah "Tampilkan" dan bukan "Present Modally"
Andy Weinstein
Oke, jadi yang ini sepertinya berfungsi untuk saya ketika saya menggunakan pengontrol tab bar untuk mengontrol tampilan lain. Namun, Anda perlu mengatur Presentasi 'Pengontrol Tab Bar' yang sebenarnya ke Layar Penuh karena ini mengontrol semua tampilan lainnya.
Charlie
12

Jika Anda memiliki UITabController dengan Layar dengan Pengontrol Navigasi Sematan, Anda harus mengatur Presentasi UITabController ke Layar Penuh seperti yang ditunjukkan pada gambar di bawah ini

masukkan deskripsi gambar di sini

Di Nerd
sumber
12

Ini solusi untuk Objective-C

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

vc.modalPresentationStyle = UIModalPresentationFullScreen;

[self presentViewController:vc animated:YES completion:nil];
Prashanth Thota
sumber
11

Terbaru untuk iOS 13 dan Swift 5.x

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

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true, completion: nil)
Rubaiyat Jahan Mumu
sumber
9

Ini versi perbaikan saya di ObjectiveC menggunakan Categories. Dengan pendekatan ini Anda akan memiliki perilaku UIModalPresentationStyleFullScreen default hingga yang lain secara eksplisit ditetapkan.

#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
Alexander Kulabukhov
sumber
apakah Anda memiliki file .h?
Pedro Góes
@ PedroGóes ya, tetapi hanya terdiri dari deklarasi kategori: `` `@interface UIViewController (Presentation) @
end`
Gunakan ini jika Anda tidak ingin berurusan dengan setiap pengontrol di storyboard Anda! Penghemat waktu, terima kasih!
AnthoPak
7

Semua jawaban lain sudah cukup tetapi untuk proyek besar seperti kami dan di mana navigasi dilakukan baik dalam kode dan storyboard, itu adalah tugas yang cukup menakutkan.

masukkan deskripsi gambar di sini

Bagi mereka yang aktif menggunakan Storyboard. Ini saran saya: gunakan Regex.

Format berikut tidak bagus untuk halaman layar penuh:

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

Format berikut bagus untuk halaman layar penuh:

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

Regex berikut yang kompatibel dengan VS CODE akan mengkonversi semua halaman Gaya Lama ke halaman gaya baru. Anda mungkin perlu keluar dari karakter khusus jika Anda menggunakan mesin regex / editor teks lainnya.

Cari Regex

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

Ganti Regex

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

Awalnya, nilai default adalah fullscreenuntuk modalPresentationStyle, tetapi di iOS 13 perubahan keUIModalPresentationStyle.automatic .

Jika Anda ingin membuat pengontrol tampilan layar penuh, Anda harus mengubah modalPresentationStylekefullScreen .

Lihat UIModalPresentationStyle dokumentasi apel untuk detail lebih lanjut dan lihat pedoman antarmuka manusia apel untuk mana harus menggunakan modalitas mana.

yo2bh
sumber
Ini adalah jawaban yang benar pada iOS 13.3, Xcode 11.3, untuk situasi di mana Anda ingin menyajikan viewController DARI navigationController. Sebuah modalPresentationStyle of .overFullScreen juga berfungsi. Namun, jika Anda menghadirkan navigationController, maka Anda perlu mengatur 'modalPresentationStyle' pada navigationController, bukan viewController. Bersulang.
Womble
3

Anda dapat dengan mudah melakukannya Buka storyboard Anda sebagai kode sumber dan cari kind="presentation", di semua tag seague dengan kind = presentasi tambahkan atribut tambahanmodalPresentationStyle="fullScreen"

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

// jika Anda ingin menonaktifkan swipe untuk mengabaikannya, tambahkan baris

Obj.isModalInPresentation = true

Periksa Dokumen Apple untuk info lebih lanjut.

Mohit Tomar
sumber
2

Saya mencapainya dengan menggunakan metode swizzling (Swift 4.2):

Untuk membuat ekstensi UIViewController sebagai berikut

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

dan di AppDelegate, dalam aplikasi: didFinishLaunchingWithOptions: aktifkan kode swizzling dengan memanggil:

UIViewController.setPresentationStyle_fullScreen()
Sreeraj VR
sumber
1

Ini bekerja untuk saya:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen

Dian
sumber
3
Ini tidak menambahkan apa pun ke semua jawaban lain yang ada.
rmaddy
1

Buat kategori untuk UIViewController (mis. UIViewController + PresentationStyle). Tambahkan kode berikut ke dalamnya.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}
Govind
sumber
ini akan merusak UISearchController + memicu beberapa kesulitan untuk men-debug crash
dklt
@ Gdk Itu pengamatan yang bagus. Jadi pengaturan properti secara eksplisit akan menyelesaikan masalah. Tidak ada solusi yang lebih sederhana jika UISearchController sedang menggunakan.
Govind
0

pendekatan alternatif adalah memiliki komponen base viewcontroller Anda sendiri di aplikasi Anda, dan hanya menerapkan inisialisasi yang ditunjuk dan diperlukan dengan pengaturan dasar, sesuatu seperti berikut:

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

CATATAN : Jika pengontrol tampilan Anda terdapat di pengontrol navigasi yang sebenarnya disajikan secara moda, maka pengontrol navigasi harus mendekati masalah dengan cara yang sama (artinya, membuat komponen pengontrol navigasi kustom Anda disesuaikan dengan cara yang sama

Diuji pada Xcode 11.1 di iOS 13.1 dan iOS 12.4

Semoga ini bisa membantu

Luca Iaco
sumber
0

Saya punya masalah dengan video yang tidak menampilkan layar penuh lagi. Menambahkan baris ini, yang menyelamatkan hari :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;
pengguna1737746
sumber
2
Ini tidak menambahkan apa pun ke semua jawaban lain yang ada.
rmaddy
0

Solusi paling sederhana yang bekerja untuk saya.

viewController.modalPresentationStyle = .fullScreen
Fahad Azeem
sumber
3
Ini tidak menambahkan apa pun ke semua jawaban lain yang ada.
rmaddy
0

Jika Anda menggunakan UINavigationController dan menanamkan ViewController sebagai pengontrol tampilan root, maka Anda juga akan bangkit dengan masalah yang sama. Gunakan kode berikut untuk mengatasinya.

let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen
Pramodya Abeysinghe
sumber
0
class MyViewController: UIViewController {

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

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

Daripada memanggil self.modalPresentationStyle = .fullScreenuntuk setiap tampilan controller, Anda dapat subclass UIViewController dan cukup gunakan di MyViewControllermana-mana.

Peter Tao
sumber
-1

Jawaban dan saran di atas benar, di bawah ini adalah versi lain, dan cara efisien menggunakan program.

# 1 Membuat Ekstensi UIView

# 2 Membuat Metode ()

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

  }
}

Memohon seperti di bawah ini

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

ATAU

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
Master_Tushar
sumber