Trình bày phương thức trong toàn màn hình iOS 13


465

Trong iOS 13, có một hành vi mới cho trình điều khiển chế độ xem chế độ khi được trình bày.

Bây giờ, nó không phải là toàn màn hình theo mặc định và khi tôi cố gắng trượt xuống, ứng dụng sẽ tự động loại bỏ Trình điều khiển xem.

Làm cách nào tôi có thể ngăn chặn hành vi này và quay lại vc modal toàn màn hình cũ?

hành vi phương thức

Cảm ơn

Câu trả lời:


622

Với iOS 13, như đã nêu trong Trạng thái nền tảng của Liên minh trong WWDC 2019, Apple đã giới thiệu một bản trình bày thẻ mặc định mới. Để buộc toàn màn hình, bạn phải xác định rõ ràng bằng:

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

81
Tôi sẽ nói điều này sẽ không ở lại lâu như mặc định. Các fullScreentùy chọn nên mặc định để ngăn chặn những thay đổi giao diện người dùng bẻ.
Jakub Truhlář

17
Tôi sẽ không tin vào điều đó. Trước đây, Apple thường thay đổi mặc định chỉ hoạt động khi bạn đang liên kết với SDK hiện tại. Chúng tôi hy vọng sẽ có được hành vi cũ khi liên kết với các phiên bản trước.
DrMickeyLauer

11
Tôi có thể xác nhận rằng các ứng dụng được xây dựng Xcode-10 chạy trên trình giả lập iOS 13 vẫn mặc định ở chế độ toàn màn hình. Như @DrMickeyLauer đã nói, việc xây dựng với Xcode 11 sẽ giúp ứng dụng có hành vi mới. Sử dụng isModalInPresentationđể chặn cử chỉ vuốt từ bỏ. Xem bài đăng trên blog của tôi để biết thêm chi tiết: Medium.com/@hacknicity/ Kẻ
Geoff Hackworth

5
Tôi khuyên bạn nên sử dụng .fullScreen thay vì .overFullScreen. .fullScreen kích hoạt viewWillAppear và viewDidAppear, .overFullScreen không làm điều đó
PiterPan

5
Thời gian đã trôi qua và .automaticphong cách đã ổn định như kiểu mặc định, đó là kiểu (đối với hầu hết các bộ điều khiển xem) .pageSheet. Tuy nhiên, một số bộ điều khiển xem hệ thống có thể ánh xạ nó sang một kiểu khác.
Jakub Truhlář

186

Tôi thêm một thông tin có thể hữu ích cho ai đó. Nếu bạn có bất kỳ phân biệt bảng phân cảnh nào, để quay lại kiểu cũ, bạn cần đặt thuộc tính loại thành Trình bày Modally và thuộc tính Bản trình bày thành Toàn màn hình .

nhập mô tả hình ảnh ở đây


2
Có cách nào trong Trình tạo giao diện để đặt isModalInPftimeation không?
Brad Thomas

Đồng ý với điều này. Thay đổi giá trị Bản trình bày cho (các) chế độ xem vi phạm mức cao nhất.
David

Đây là một trong những làm việc cho tôi bởi vì tôi có performSegue. Cảm ơn thân yêu!
Blasanka

95

Tôi gặp vấn đề này trên màn hình ban đầu ngay sau màn hình khởi chạy. Cách khắc phục cho tôi vì tôi không có lỗi hoặc logic được xác định là chuyển bản trình bày từ tự động sang toàn màn hình như được hiển thị ở đây:

fix_storyboard_presentation_default_behavior


2
Có cách nào để thực hiện việc này theo chương trình cho tất cả các lượt xem thay vì từng lượt một qua bảng phân cảnh không?
The1993

@ The1993 Bạn có tìm thấy sự thay thế nào không?
Shobhit Puri

1
@ShobhitPuri Hãy xem giải pháp đầu tiên của Omreyh tại đây stackoverflow.com/a/58255416/4323101
The1993

1
Wow, đây là câu trả lời cho các vấn đề của tôi. Cảm ơn vì tiền hỗ trợ! Đối với bất kỳ ai khác cũng đang xem xét vấn đề này, đây là bản sửa lỗi cho hành vi lạ sau khi mở lại ứng dụng từ nền. Trong ứng dụng của tôi, mở từ nền sẽ che phủ màn hình giật gân của tôi (bộ điều khiển xem ban đầu) dưới dạng kiểu trình bày thẻ và sau đó mọi phân biệt từ đây trở đi sẽ mờ dần thay vì sử dụng kiểu segue đã xác định của tôi. Sẽ ổn thôi nếu tôi đóng ứng dụng (chạm hai lần vào nút home và vuốt lên, sau đó mở lại) nhưng bất kỳ lần khởi chạy bổ sung nào cũng sẽ gây ra hành vi kỳ lạ này. Cảm ơn một lần nữa!
Justin

92

Có nhiều cách để làm điều đó và tôi nghĩ rằng mỗi người có thể phù hợp với một dự án nhưng không phải là một dự án khác, vì vậy tôi nghĩ tôi sẽ giữ chúng ở đây có thể người khác sẽ chạy đến một trường hợp khác.

1- Ghi đè hiện tại

Nếu bạn có một BaseViewControllerbạn có thể ghi đè present(_ viewControllerToPresent: animated flag: completion:)phương thức.

class BaseViewController: UIViewController {

  // ....

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

  // ....
}

Sử dụng theo cách này, bạn không cần thực hiện bất kỳ thay đổi nào đối với bất kỳ presentcuộc gọi nào , vì chúng tôi chỉ áp dụng presentphương thức này.

2- Một phần mở rộng:

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

Sử dụng:

presentInFullScreen(viewController, animated: true)

3- Đối với một UIViewContoder

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

4- Từ Storyboard

Chọn một segue và đặt bản trình bày thành FullScreen.
nhập mô tả hình ảnh ở đây

5- Lướt

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

Cách sử dụng:
Trong AppDelegatebên trong của bạn application(_ application: didFinishLaunchingWithOptions)thêm dòng này:

UIViewController.swizzlePresent()

Sử dụng theo cách này, bạn không cần thực hiện bất kỳ thay đổi nào đối với bất kỳ cuộc gọi hiện tại nào, vì chúng tôi đang thay thế việc thực hiện phương thức hiện tại trong thời gian chạy.
Nếu bạn cần biết những gì đang xảy ra, bạn có thể kiểm tra liên kết này: https://nshipster.com/swift-objc-r nb /


Tôi có nhiều viewControllers trong dự án của mình, nhưng không có lớp cơ sở, tôi không muốn bị sưng, bạn có giải pháp nào cho điều đó với những thay đổi tối thiểu trong mã
guru

Tôi đã sử dụng swizzling, nhưng tôi đã thêm .pageSheet vào điều kiện .... if viewControllToPftime.modalPftimeationStyle == .pageSheet || viewControllToPftime.modalPftimeationStyle == .automatic {viewControllToPftime.modalPftimeationStyle = .fullScreen}
Sụp đổ

thanh trạng thái bị ẩn khi tôi thêm giải pháp áp dụng số 1.
Ganesh Pawar

4
Swizzling là một giải pháp hoạt động tuyệt vời trong một thời gian. Tuy nhiên, khi sử dụng một số sdks bên ngoài như FacebookLogin (5,8 tính đến ngày hôm nay) và GoogleSignin, tôi đã nhận thấy rằng phương pháp này phá vỡ các luồng đó: chúng ta có một màn hình trắng trên iPad. Điều này có lẽ là do thực tế là họ sử dụng phương pháp tạo hình của riêng mình
Tao-Nhân Nguyễn

39

Tôi đã sử dụng swizzling cho 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)
    }
}

sau đó đặt cái này

UIViewController.preventPageSheetPresentation

một vài nơi

ví dụ trong AppDelegate

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

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
Giải pháp dễ nhất nếu bạn có nhiều phương thức.
Raisal Calicut

ở đâu đó có nghĩa là, có nghĩa là trong tập tin hoặc nơi trong toàn bộ dự án
Yatendra

Ở đâu đó bạn, tôi đặt nó trong appdelegate static letlà lười biếng, bạn phải đọc nó để cho nó được tính toán, var lười biếng chỉ được tính một lần, tôi sử dụng nó để đảm bảo rằng sự thay đổi được gọi là một lần
Maxime Ashurov

37

Dành cho người dùng Objective-C

Chỉ cần sử dụng mã này

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Hoặc nếu bạn muốn thêm cụ thể vào iOS 13.0 thì hãy sử dụng

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

2
điều này cũng hoạt động trên phiên bản ios trước đó, nhưng câu trả lời là tốt
Catalin

4
UIModalPftimeationFullScreen hoạt động với iOS 3.2+. Vì vậy, không cần phải thêm nếu điều kiện khác.
ngọn lửa3

2
Vì một số lý do trong iOS 13.1.2 chỉ trong các lớp Obj-c, điều này không hoạt động và modalPftimeationStyle chỉ hiển thị một pageSheet. Điều này xảy ra cho bất cứ ai khác?
Sevy11

@ Sevy11 Tôi chưa cập nhật lên iOS 13.1.2 nhưng hoạt động tốt vào 13.1
9to5ios

hi @ Sevy11 Tôi đã cập nhật iOS 13.1.2 và nó hoạt động tốt, vui lòng kiểm tra ở cuối của bạn
9to5ios

36

Lót:

modalPresentationStylelà bắt buộc phải được đặt trên navigationContoder đang được trình bày .


iOS 13 trở xuống phiên bản iOS fullScreen với overCurrentContextnavigationController

Mã kiểm tra

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

modalPftimeationStyle yêu cầu thiết lập tại navigationContoder .


Một cách làm rõ: trình bày một viewContoder từ navigationContoder không cần modalPftimeationStyle được đặt trên navigationContoder. Thay vào đó, nó được đặt trên viewContoder đang được trình bày. Tuy nhiên, nếu bạn đang trình bày một điều khiển điều hướng, thì thuộc tính 'modalPftimeationStyle' phải được đặt trên navigationContoder, chứ không phải là viewControll nhúng. Cách tiếp cận này hoạt động iOS 13.3, Xcode 11.3. Xem câu trả lời của Yogesh Bharate.
Womble

@Pratik Sodha. Bất kỳ trợ giúp về điều này? stackoverflow.com/questions/61429600/ Mạnh
david

@Womble Bất kỳ trợ giúp nào về stackoverflow.com/questions/61429600/
david

25

Như một gợi ý: Nếu bạn gọi mặt để một ViewControllermà được nhúng vào bên trong một NavigationController, bạn phải thiết lập NavigationControllerđể.fullScreen và không phải là VC.

Bạn có thể làm điều này như @davidbates hoặc bạn làm điều đó theo chương trình (như @pascalbros).

Một kịch bản ví dụ:

nhập mô tả hình ảnh ở đây

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

21

Tôi cần phải làm cả hai:

  1. Đặt kiểu trình bày là Toàn màn hình

    Toàn màn hình

  2. Đặt thanh trên cùng làm thanh điều hướng mờ

Thanh trên cùng


Đó là một giả định rất kỳ lạ rằng một số tùy chọn trong Số liệu mô phỏng giúp bạn thay đổi phong cách trình bày
Alexander Kulabukhov

14

Thay đổi modalPresentationStyletrước khi trình bày

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

Đây là một giải pháp dễ dàng mà không cần mã hóa một dòng duy nhất.

  • Chọn Xem Trình điều khiển trong Storyboard
  • Chọn thanh tra thuộc tính
  • Đặt bản trình bày "Tự động" thành "FullScreen" theo hình ảnh bên dưới

Thay đổi này làm cho hành vi của ứng dụng iPad như mong đợi nếu không màn hình mới sẽ hiển thị ở giữa màn hình dưới dạng cửa sổ bật lên.

nhập mô tả hình ảnh ở đây


Tôi nghĩ rằng điều quan trọng ở đây là bạn đã làm điều này trên NavigationContoder, đây là những gì hình ảnh hiển thị nhưng văn bản không nói theo cách này.
Andy Weinstein

1
cũng đảm bảo các phân biệt tiếp theo là "Hiển thị" chứ không phải "Trình bày theo phương thức"
Andy Weinstein

Ok, do đó, cái này có vẻ hoạt động với tôi khi tôi sử dụng bộ điều khiển thanh tab để kiểm soát các chế độ xem khác. Tuy nhiên, bạn cần đặt Bản trình bày của 'Trình điều khiển thanh tab' thực tế thành Toàn màn hình vì điều này kiểm soát tất cả các chế độ xem khác.
Charlie

12

Nếu bạn có UITabContoder có màn hình với Bộ điều khiển điều hướng nhúng, bạn phải đặt Bản trình bày UITabControll thành FullScreen như trong hình bên dưới

nhập mô tả hình ảnh ở đây


12

Đây là giải pháp cho Objective-C

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

vc.modalPresentationStyle = UIModalPresentationFullScreen;

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

10

Mới nhất cho iOS 13 và Swift 5.x

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

vc.modalPresentationStyle = .fullScreen

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

9

Đây là phiên bản sửa lỗi của tôi trong ObjectiveC bằng cách sử dụng Danh mục. Với cách tiếp cận này, bạn sẽ có hành vi UIModalPftimeationStyleFullScreen mặc định cho đến khi một hành vi khác được thiết lập rõ ràng.

#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

bạn có tập tin .h không?
Pedro Góes

@ PedroGóes yep, nhưng nó chỉ bao gồm khai báo danh mục: `` `@interface UIViewControll (Trình bày) @
end`

Sử dụng điều này nếu bạn không muốn đối phó với mọi bộ điều khiển trong bảng phân cảnh của mình! Tiết kiệm thời gian, cảm ơn!
AnthoPak

7

Tất cả các câu trả lời khác là đủ nhưng đối với một dự án lớn như của chúng tôi và nơi điều hướng đang được thực hiện cả về mã và bảng phân cảnh, thì đó là một nhiệm vụ khá khó khăn.

nhập mô tả hình ảnh ở đây

Đối với những người đang tích cực sử dụng Storyboard. Đây là lời khuyên của tôi: sử dụng Regex.

Định dạng sau không tốt cho các trang toàn màn hình:

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

Định dạng sau phù hợp với các trang toàn màn hình:

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

Regex sau đây tương thích với VS CODE sẽ chuyển đổi tất cả các trang Kiểu cũ sang các trang kiểu mới. Bạn có thể cần phải thoát các ký tự đặc biệt nếu bạn đang sử dụng các trình soạn thảo văn bản / trình soạn thảo văn bản khác.

Tìm kiếm Regex

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

Thay thế Regex

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

4

Ban đầu, giá trị mặc định là fullscreendành cho modalPftimeationStyle, nhưng trong iOS 13, các thay đổi của nó đối vớiUIModalPresentationStyle.automatic .

Nếu bạn muốn tạo bộ điều khiển xem toàn màn hình, bạn phải thay đổi modalPresentationStylethànhfullScreen .

Tham khảo UIModalPresentationStyle tài liệu về apple để biết thêm chi tiết và tham khảo hướng dẫn giao diện apple apple về nơi nên sử dụng phương thức nào.


Đây là câu trả lời chính xác kể từ iOS 13.3, Xcode 11.3, cho các tình huống mà bạn muốn trình bày một viewContoder TỪ một NavigationContoder. Một modalPftimeationStyle của .overFullScreen cũng hoạt động. Tuy nhiên, nếu bạn đang trình bày một điều khiển điều hướng, thì bạn cần phải đặt 'modalPftimeationStyle' trên navigationContoder, chứ không phải viewContoder. Chúc mừng.
Womble

3

Bạn có thể dễ dàng làm như vậy Mở bảng phân cảnh của bạn dưới dạng mã nguồn và tìm kiếm kind="presentation", trong tất cả các thẻ đi biển với kind = thuyết trình thêm một thuộc tính bổ sungmodalPresentationStyle="fullScreen"


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

// nếu bạn muốn tắt chức năng vuốt để loại bỏ nó, hãy thêm dòng

Obj.isModalInPresentation = true

Kiểm tra Tài liệu Apple để biết thêm.


2

Tôi đã đạt được nó bằng cách sử dụng phương pháp swizzling (Swift 4.2):

Để tạo một phần mở rộng UIViewControll như sau

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

và trong AppDelegate, trong ứng dụng: didFinishLaunchingWithOptions: gọi mã swizzling bằng cách gọi:

UIViewController.setPresentationStyle_fullScreen()

1

Điều này làm việc cho tôi:

yourViewControll.modalPftimeationStyle = UIModalPftimeationStyle.fullScreen


3
Điều này không thêm gì cho tất cả các câu trả lời hiện có khác.
rmaddy

1

Tạo một thể loại cho UIViewContoder (giả sử UIViewControll + PresentationStyle). Thêm mã sau đây vào nó.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}

điều này sẽ phá vỡ UISearchControll + gây ra một số sự cố khó gỡ lỗi
dklt

@dklt Đó là một quan sát tuyệt vời. Vì vậy, thiết lập tài sản rõ ràng sẽ giải quyết vấn đề. Không có giải pháp đơn giản hơn nếu UISearchControll đang sử dụng.
Govind

0

một cách tiếp cận khác là có thành phần điều khiển khung nhìn cơ sở của riêng bạn trong ứng dụng của bạn và chỉ cần thực hiện các trình khởi tạo được chỉ định và bắt buộc với một thiết lập cơ bản, đại loại như sau:

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

GHI CHÚ : Nếu bộ điều khiển xem của bạn được chứa trong bộ điều khiển điều hướng thực sự được trình bày theo phương thức, thì bộ điều khiển điều hướng sẽ tiếp cận vấn đề theo cách tương tự (nghĩa là, có thành phần bộ điều khiển điều hướng tùy chỉnh của bạn được tùy chỉnh theo cùng một cách

Đã thử nghiệm trên Xcode 11.1 trên iOS 13.1 và iOS 12.4

Hy vọng nó giúp


0

Tôi gặp vấn đề này với một video không hiển thị toàn màn hình nữa. Đã thêm dòng này, đã lưu trong ngày :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
Điều này không thêm gì cho tất cả các câu trả lời hiện có khác.
rmaddy

0

Giải pháp đơn giản nhất đã làm việc cho tôi.

viewController.modalPresentationStyle = .fullScreen

3
Điều này không thêm gì cho tất cả các câu trả lời hiện có khác.
rmaddy

0

Nếu bạn đang sử dụng UINavestionContaptor và nhúng ViewContoder làm trình điều khiển xem gốc, thì bạn cũng sẽ gặp vấn đề tương tự. Sử dụng mã sau đây để khắc phục.

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

Thay vì gọi self.modalPresentationStyle = .fullScreencho mọi trình điều khiển xem, bạn có thể phân lớp UIViewContoder và chỉ cần sử dụng MyViewControllerở mọi nơi.


-1

Các câu trả lời và đề xuất ở trên là đúng, bên dưới là một phiên bản khác và cách sử dụng hiệu quả bằng lập trình.

# 1 Tạo tiện ích mở rộng UIView

# 2 Tạo một Phương thức ()

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

  }
}

Gọi như dưới đây

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

HOẶC LÀ

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.