Tắt tính năng loại bỏ tương tác của bộ điều khiển chế độ xem được trình bày trong iOS 13


135

iOS 13 giới thiệu một thiết kế mới của modalPresentationStyle .pageSheet(và anh chị em của nó .formSheet) cho các bộ điều khiển chế độ xem được trình bày theo phương thức…

Bản trình bày phương thức trượt mới trong iOS 13

… Và chúng ta có thể loại bỏ các trang tính này bằng cách trượt bộ điều khiển chế độ xem đã trình bày xuống (loại bỏ tương tác) . Mặc dù tính năng "kéo để loại bỏ" mới khá hữu ích, nhưng nó có thể không phải lúc nào cũng mong muốn.

CÂU HỎI: Làm cách nào để tắt tính năng loại bỏ tương tác? - Hãy nhớ rằng chúng tôi giữ nguyên phong cách trình bày.



6
@MehulThakkar Đó là một câu hỏi khác.
Jakub Truhlář

Câu trả lời:


240

Lựa chọn 1:

viewController.isModalInPresentation = true

Đã vô hiệu hóa loại bỏ tương tác

(Loại .pageSheetbỏ tương tác bị vô hiệu hóa hoạt động như thế này.)

  • Kể từ iOS 13, UIViewControllercó một thuộc tính mới được gọi là isModalInPresentationthuộc tính phải được đặt trueđể ngăn việc loại bỏ tương tác.
  • Về cơ bản, nó bỏ qua các sự kiện bên ngoài giới hạn của bộ điều khiển chế độ xem. Hãy ghi nhớ điều đó nếu bạn đang sử dụng không chỉ kiểu tự động mà còn cả các kiểu trình bày như .popoverv.v.
  • Thuộc tính này là falsetheo mặc định.

Từ tài liệu chính thức : Nếu true, UIKit bỏ qua các sự kiện bên ngoài giới hạn của bộ điều khiển chế độ xem và ngăn việc loại bỏ tương tác của bộ điều khiển chế độ xem khi nó ở trên màn hình.


Lựa chọn 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Kể từ iOS 13, UIAdaptivePresentationControllerDelegatecó một phương thức mới được gọi là presentationControllerShouldDismiss.
  • Phương thức này chỉ được gọi nếu bộ điều khiển dạng xem được trình bày không bị loại bỏ theo chương trình và thuộc tính của nó isModalInPresentationđược đặt thành false.

Mẹo: Đừng quên chỉ định đại biểu của PresentationController.


2
Nếu bộ điều khiển chế độ xem được trình bày là bộ điều khiển điều hướng, bạn có thể đặt isModalInPresentationtrên bộ điều khiển điều hướng hoặc trên bộ điều khiển chế độ xem riêng lẻ được hiển thị trong ngăn xếp điều hướng. Tùy chọn thứ hai cho phép bạn chọn trên cơ sở từng màn hình xem có thể loại bỏ tương tác hay không. Cẩn thận với bộ điều khiển tìm kiếm, chúng được ưu tiên hơn bộ điều khiển chế độ xem riêng lẻ (nhưng không phải bộ điều khiển điều hướng). Thông tin thêm trong bài đăng trên blog của tôi: medium.com/@hacknicity/…
Geoff Hackworth

1
Hãy ghi nhớ rằng nếu VC của bạn được trình bày như một popover, điều này sẽ ngăn chặn sự popover khỏi bị sa thải khi khai thác bên ngoài của nó
PatrickDotStar

4
Objective-C:viewController.modalInPresentation = YES;
quarac

3
Bất cứ ai có điều này để làm việc khi đặt cờ này trên a UIImagePickerController? Đối với chúng tôi, có vẻ như nó UIImagePickerControllerđang bỏ qua nó và vì vậy nó có thể bị loại bỏ bằng cử chỉ vuốt. Có thể đó là một lỗi iOS 13.
PatrickDotStar

4
Khi presentationControllerShouldDismiss(_ presentationController: UIPresentationController)trả về false, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)được gọi để bạn có thể thực hiện những việc như thêm hộp thoại xác nhận nếu người dùng đã nhập dữ liệu.
Neil

66
  1. Nếu bạn muốn hành vi giống như trong phiên bản iOS trước (<iOS13) như bản trình bày mô hình ở chế độ toàn màn hình, chỉ cần đặt kiểu trình bày của bộ điều khiển chế độ xem đích của bạn thành UIModalPresentationStyle.fullScreen

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen

    Và nếu bạn đang sử dụng bảng phân cảnh, chỉ cần chọn segua và chọn Full Screenbiểu mẫu Presentationthả xuống.

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

  2. Nếu bạn chỉ muốn vô hiệu hóa các sa thải tương tác và giữ mới thiết lập phong cách trình bày UIViewControllertài sản isModalInPresentationđể true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }

Nó hoạt động tốt hơn so với sử dụng {controller.isModalInPresentation = true}.
Maxim Firsoff

8

Tài sản isModalInPresentationcó thể giúp đỡ.

Từ tài liệu:

Khi bạn đặt nó thành true, UIKit bỏ qua các sự kiện bên ngoài giới hạn của bộ điều khiển chế độ xem và ngăn việc loại bỏ tương tác của bộ điều khiển chế độ xem khi nó ở trên màn hình.

Bạn có thể sử dụng nó như thế này:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)

5

Nếu bạn đang sử dụng bảng phân cảnh để bố trí giao diện người dùng của mình, tôi đã tìm thấy cách tốt nhất để tắt loại bỏ tương tác này khi sử dụng bộ điều khiển điều hướng là thay đổi bản trình bày của Bộ điều khiển điều hướng trong trình kiểm tra thuộc tính từ Tự động thành Toàn màn hình. Khi đó, tất cả bộ điều khiển chế độ xem trong ngăn xếp điều hướng của bạn sẽ ở chế độ toàn màn hình và người dùng sẽ không thể loại bỏ.

Trình kiểm tra thuộc tính hiển thị tùy chọn trình bày cho bộ điều khiển điều hướng


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.