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

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)

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


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


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/


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
}

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
 }

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 .


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)

22

Saya perlu melakukan keduanya:

  1. Tetapkan gaya presentasi sebagai Layar penuh

    Layar penuh

  2. Setel bilah Top sebagai Bilah Navigasi Tembus

Bilah atas


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;

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


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


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];

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)

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

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

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.


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"


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.


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

1

Ini bekerja untuk saya:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


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

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


0

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

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
Ini tidak menambahkan apa pun ke semua jawaban lain yang ada.
rmaddy

0

Solusi paling sederhana yang bekerja untuk saya.

viewController.modalPresentationStyle = .fullScreen

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

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.


-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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.