Trình bày phương thức iOS 13 mới: Trình điều khiển trình bày không di chuyển xuống


11

Tôi có một hành vi kỳ lạ khi trình bày UIViewControllers một cách vừa phải trong iOS 13. Phong cách trình bày mới mà tôi đã thấy trên iOS 13 trông như thế này:

Trình điều khiển khung nhìn trình bày xuất hiện phía sau trình điều khiển khung nhìn được trình bày. Nó cũng được chuyển xuống để bắt chước một "ngăn xếp"

Trình điều khiển khung nhìn trình bày xuất hiện phía sau trình điều khiển khung nhìn được trình bày.  Nó cũng được chuyển xuống để bắt chước một "ngăn xếp"

Trong khi đó, khi trình bày các bộ điều khiển xem thông qua ứng dụng của mình, tôi tiếp tục nhận được hiệu ứng này:

Bộ điều khiển khung nhìn trình bày hoàn toàn không di chuyển khi trình bày bộ điều khiển khung nhìn mới

Bộ điều khiển khung nhìn trình bày hoàn toàn không di chuyển khi trình bày bộ điều khiển khung nhìn mới

Tôi sử dụng mã này để trình bày bộ điều khiển xem này:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Đây là câu hỏi của tôi: Tôi đang tự hỏi tại sao điều này lại xảy ra và liệu có cách nào để trình bày các bộ điều khiển xem theo kiểu iOS 13 bình thường (với bộ điều khiển xem trình bày di chuyển trở lại).

Cảm ơn trước!


Để thử nghiệm, hãy thử nhận xét controller.modalTransitionStyle = .coverVerticalvà thậm chí controller.modalPresentationStyle = .pageSheet(mặc dù phong cách trình bày sẽ là cần thiết nếu mã này cũng được chạy trên iPad).
rmaddy

Tôi đã nhận xét nhưng không thay đổi gì cả :(
CentrumGuy

Câu trả lời:


3

Hóa ra vấn đề là hệ thống phân cấp điều khiển xem của tôi. Tôi đã có thể sửa nó bằng cách làm cho trình điều khiển khung nhìn trình bày thành trình điều khiển xem gốc của ứng dụng của tôi. Đầu tiên tôi đặt bộ điều khiển nền làm bộ điều khiển xem gốc bằng cách gọi

window.rootViewController = self

và sau đó sử dụng mã trước đây của tôi

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Tôi đã trình bày bộ điều khiển xem. Cảm ơn mọi người đã cố gắng giúp đỡ!


Tôi đang có cùng một vấn đề. Bạn đã đặt cờ rootViewControll ở đâu? Ngay trước khi phân biệt?
Paweł Zgoda-Ferchmin

Tôi đặt nó khi tôi trình bày "bộ điều khiển nền". Chúng ta hãy gọi họ là bộ điều khiển 1, 2 và 3 để làm cho mọi thứ dễ dàng hơn (1 là xa nhất ở phía sau, 2 ở phía sau 3 và 3 ở phía trước hay còn gọi là Trình điều khiển hướng dẫn). Chúng tôi hiện đang xem xét bộ điều khiển 1. Thay vì gọi Present () trên bộ điều khiển 1 để trình bày bộ điều khiển 2, tôi chỉ đặt bộ điều khiển 2 làm bộ điều khiển xem gốc. Điều này về cơ bản loại bỏ bộ điều khiển 1 và cửa sổ của chúng tôi hiện chỉ có bộ điều khiển 2 trong hệ thống phân cấp. Bây giờ, bạn có thể trình bày bộ điều khiển 3 bình thường bằng cách gọi Present () trên bộ điều khiển 2.
CentrumGuy

Chắc chắn, điều đó hiệu quả với tôi nhưng gây ra một loạt các vấn đề khác nhau như biến mất thanh trạng thái hoặc cắt hoạt hình trong quá trình tách biệt, tôi cũng không nghĩ rằng nó an toàn. Phải có một giải pháp tốt hơn cho việc này ...
Paweł Zgoda-Ferchmin

Khi nào những vấn đề này xảy ra? Khi bạn gọi hiện tại () hoặc khi bạn đặt bộ điều khiển xem gốc? Thanh trạng thái biến mất có thể là do thanh trạng thái ở dạng văn bản màu đen và xuất hiện trên nền đen khi hiện tại () xảy ra khiến nó hòa trộn với nền của ứng dụng.
CentrumGuy

1
Tôi đã tạo một dự án demo đơn giản. Bạn có thể nhìn vào nó ở đây: github . Tất cả logic nằm trong Bộ điều khiển1.swift. Hãy cho tôi biết nếu điều này sẽ giúp!
CentrumGuy

1

Tôi nghĩ vấn đề có thể được giải quyết bằng cách sử dụng vc.modalPresentationStyle = .fullScreennếu không có UINavestionControll, nếu không bạn có thể sử dụng các mã này như sau:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

bởi vì với iOS 13, đây là một tính năng mới mà Apple đã thay đổi kiểu trình bày mặc định của Bộ điều khiển xem thành bảng điều khiển từ toàn màn hình trong iOS 12


2
.fullScreen làm cho nó trông giống như bản trình bày iOS 12 cũ mà bạn không thể thấy bộ điều khiển đằng sau nó. Đó không phải là những gì tôi sẽ làm.
CentrumGuy

@CentrumGuy, bạn có thể thấy liên kết " Medium.com/better-programming/ ,", Nó đã được giải thích chi tiết.
Apple đã thay đổi mặc định

1
Tôi biết Apple đã thay đổi kiểu trình bày mặc định trong iOS 13. Tuy nhiên, khi tôi trình bày các bộ điều khiển xem của mình trong ứng dụng của mình, bộ điều khiển trình bày không di chuyển như mọi nơi khác trên iOS 13. Bạn có thể nhìn vào sự khác biệt giữa thứ nhất và thứ hai hình ảnh theo cách trình điều khiển xem trình bày được hiển thị phía sau trình điều khiển xem trên cùng. Tôi muốn lấy của tôi để hiển thị như hình ảnh đầu tiên
CentrumGuy

Tôi rất vui vì tôi có thể giúp!
glotcha

1

Lập trình:

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

Từ bảng phân cảnh:

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

Đó là nó. Không cần phải chơi với bộ điều khiển gốc hoặc cửa sổ nào cả.

Để tham khảo, hãy truy cập bài viết này .


0

Chúng ta có thể thay đổi nó trong Thanh công cụ Thanh tra. Để đạt được điều đó: hãy đến phần thứ năm của Thanh tra Tollbar sau đó thay đổi trường Bản trình bày thành Toàn màn hình.


-1

Đây phải là tài sản duy nhất bạn cần đặt

presentedViewController.modalPresentationStyle = .automatic

Chi tiết trong https://developer.apple.com/ideo/play/wwdc2019/224/


Đặt nó thành tự động dường như không khắc phục được sự cố này
CentrumGuy

Bộ điều khiển khung nhìn phía sau bộ điều khiển khung nhìn phía trước là cái tôi gọi là "hiện tại" trên. (Người bạn có thể thấy đằng sau bộ điều khiển)
CentrumGuy

nó là cái gốc bạn có thể kiểm tra window.rootViewControll
glotcha
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.