ใหม่การนำเสนอ Modal iOS 13: การนำเสนอตัวควบคุมไม่ย้ายลง


11

ฉันมีพฤติกรรมแปลก ๆ เมื่อนำเสนอ UIViewControllers อย่างสุภาพใน iOS 13 รูปแบบการนำเสนอใหม่ที่ฉันเห็นใน iOS 13 มีลักษณะดังนี้:

ตัวควบคุมมุมมองการนำเสนอปรากฏขึ้นด้านหลังตัวควบคุมมุมมองการนำเสนอ นอกจากนี้ยังเลื่อนลงเพื่อเลียนแบบ "สแต็ค"

ตัวควบคุมมุมมองการนำเสนอปรากฏขึ้นด้านหลังตัวควบคุมมุมมองการนำเสนอ  นอกจากนี้ยังเลื่อนลงเพื่อเลียนแบบ "สแต็ค"

ในขณะเดียวกันเมื่อนำเสนอตัวควบคุมมุมมองผ่านแอพของฉันฉันจะได้รับเอฟเฟกต์นี้:

ตัวควบคุมมุมมองการนำเสนอไม่ได้เคลื่อนที่เลยเมื่อแสดงตัวควบคุมมุมมองใหม่

ตัวควบคุมมุมมองการนำเสนอไม่ได้เคลื่อนที่เลยเมื่อแสดงตัวควบคุมมุมมองใหม่

ฉันใช้รหัสนี้เพื่อนำเสนอตัวควบคุมมุมมองนี้:

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

นี่คือคำถามของฉัน: ฉันสงสัยว่าทำไมสิ่งนี้ถึงเกิดขึ้นและหากมีวิธีที่จะนำเสนอตัวควบคุมมุมมองในรูปแบบ iOS 13 ปกติ (ด้วยตัวควบคุมมุมมองการนำเสนอที่ย้ายกลับมา)

ขอบคุณล่วงหน้า!


ในการทดสอบลองแสดงความคิดเห็นcontroller.modalTransitionStyle = .coverVerticalและแม้กระทั่งcontroller.modalPresentationStyle = .pageSheet(แม้ว่าจะต้องใช้รูปแบบการนำเสนอถ้ารหัสนี้ยังทำงานบน iPad)
rmaddy

ฉันแสดงความคิดเห็น แต่ไม่เปลี่ยนแปลงอะไรเลย: (
CentrumGuy

คำตอบ:


3

กลับกลายเป็นว่าปัญหาคือลำดับชั้นมุมมองของฉัน ฉันสามารถแก้ไขได้โดยทำให้ตัวควบคุมมุมมองการนำเสนอเป็นตัวควบคุมมุมมองรูทของแอปของฉัน ครั้งแรกที่ฉันตั้งค่าตัวควบคุมพื้นหลังเป็นตัวควบคุมมุมมองรากโดยการโทร

window.rootViewController = self

แล้วใช้รหัสก่อนหน้าของฉัน

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

ฉันนำเสนอตัวควบคุมมุมมอง ขอบคุณทุกคนที่พยายามช่วย!


ฉันมีปัญหาเดียวกัน คุณตั้งค่าสถานะ rootViewController ที่ไหน ก่อนที่จะทำต่อ?
Paweł Zgoda-Ferchmin

ฉันตั้งมันเมื่อฉันนำเสนอ "ตัวควบคุมพื้นหลัง" ลองเรียกพวกมันว่าตัวควบคุม 1, 2 และ 3 เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น (1 อยู่ด้านหลังสุด, 2 อยู่ด้านหลัง 3 และ 3 เป็นตัวที่อยู่ข้างหน้าหรือเป็นตัวควบคุม Tutorial) ขณะนี้เรากำลังดูคอนโทรลเลอร์ 1 แทนที่จะเรียกปัจจุบัน () บนคอนโทรลเลอร์ 1 ถึงปัจจุบันคอนโทรลเลอร์ 2 ฉันเพิ่งตั้งคอนโทรลเลอร์ 2 เป็นคอนโทรลเลอร์มุมมองรูท นี่เป็นการกำจัดตัวควบคุม 1 และหน้าต่างของเราตอนนี้มีตัวควบคุม 2 เท่านั้นในลำดับชั้น ตอนนี้คุณสามารถนำเสนอตัวควบคุม 3 ได้ตามปกติโดยการเรียก present () บนตัวควบคุม 2
CentrumGuy

แน่นอนว่าใช้งานได้สำหรับฉัน แต่ทำให้เกิดปัญหาที่แตกต่างหลากหลายเช่นแถบสถานะหายไปหรือการตัดแอนิเมชันระหว่างทำต่อฉันไม่คิดว่ามันปลอดภัย จะต้องมีวิธีแก้ปัญหาที่ดีกว่านี้ ...
Paweł Zgoda-Ferchmin

ปัญหาเหล่านี้เกิดขึ้นเมื่อใด เมื่อคุณเรียกปัจจุบัน () หรือเมื่อคุณตั้งค่าตัวควบคุมมุมมองราก แถบสถานะที่หายไปอาจเป็นเพราะแถบสถานะเป็นข้อความสีดำและปรากฏบนพื้นหลังสีดำเมื่อเกิด () ปัจจุบันทำให้เกิดการผสมผสานกับพื้นหลังของแอปพลิเคชัน
CentrumGuy

1
ฉันสร้างโครงการตัวอย่างง่ายๆ คุณสามารถดูมันมากกว่าที่นี่: GitHub ตรรกะทั้งหมดอยู่ใน Controller1.swift แจ้งให้เราทราบหากนี่ช่วยได้!
CentrumGuy

1

ฉันคิดว่าปัญหาสามารถแก้ไขได้โดยใช้vc.modalPresentationStyle = .fullScreenหากไม่มี UINavigationController มิฉะนั้นคุณสามารถใช้รหัสเหล่านี้ได้ดังนี้

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

เพราะด้วย iOS 13 นี่เป็นคุณสมบัติใหม่ที่ Apple ได้เปลี่ยนรูปแบบการนำเสนอเริ่มต้นของ View Controllers ให้เป็น modal ชีตจาก fullscreen ใน iOS 12


2
.fullScreen ทำให้ดูเหมือนกับการนำเสนอ iOS 12 แบบเก่าซึ่งคุณไม่สามารถเห็นตัวควบคุมอยู่ด้านหลังได้เลย นั่นไม่ใช่สิ่งที่ฉันจะทำ
CentrumGuy

@CentrumGuy คุณอาจเห็นลิงก์ " medium.com/better-programming/ ...... " ซึ่งอธิบายไว้ในรายละเอียด
Apple ได้เปลี่ยนค่าเริ่มต้น

1
ฉันรู้ว่า Apple เปลี่ยนสไตล์การนำเสนอเริ่มต้นใน iOS 13 อย่างไรก็ตามเมื่อฉันนำเสนอตัวควบคุมมุมมองของฉันในแอปตัวควบคุมการนำเสนอของฉันจะไม่ย้ายไปเหมือนที่อื่นใน iOS 13 คุณสามารถดูความแตกต่างระหว่างตัวแรกและตัวที่สอง รูปภาพในวิธีที่ตัวควบคุมมุมมองการนำเสนอแสดงอยู่ด้านหลังตัวควบคุมมุมมองด้านบนสุด ฉันต้องการให้ฉันแสดงเหมือนภาพแรก
CentrumGuy

ฉันดีใจที่ฉันสามารถช่วยได้!
glotcha

1

โปรแกรม:

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

จากกระดานเรื่องราว:

ป้อนคำอธิบายรูปภาพที่นี่

แค่นั้นแหละ. ไม่จำเป็นต้องเล่นกับตัวควบคุมรูทหรือหน้าต่างเลย

สำหรับการอ้างอิงเยี่ยมชมบทความนี้


0

เราสามารถเปลี่ยนได้ในแถบเครื่องมือตรวจสอบ เพื่อให้บรรลุ: ตรงไปที่ส่วนที่ห้าของสารวัตร Tollbar จากนั้นเปลี่ยนฟิลด์การนำเสนอเป็นแบบเต็มหน้าจอ


-1

นี่เป็นคุณสมบัติเดียวที่คุณต้องตั้งค่า

presentedViewController.modalPresentationStyle = .automatic

รายละเอียดใน https://developer.apple.com/videos/play/wwdc2019/224/


การตั้งค่าเป็นอัตโนมัติจะไม่ปรากฏขึ้นเพื่อแก้ไขปัญหานี้
CentrumGuy

ตัวควบคุมมุมมองด้านหลังตัวควบคุมมุมมองเบื้องหน้าคือส่วนที่ฉันเรียกว่า "นำเสนอ" บน (สิ่งที่คุณสามารถมองเห็นด้านหลังคอนโทรลเลอร์)
CentrumGuy

มันเป็นรากหรือไม่ คุณสามารถตรวจสอบ window.rootViewController
glotcha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.