ปิดใช้งานการปิดการโต้ตอบของตัวควบคุมมุมมองที่นำเสนอใน iOS 13


135

iOS 13นำเสนอการออกแบบใหม่ของmodalPresentationStyle .pageSheet(และรุ่นพี่น้อง.formSheet) สำหรับตัวควบคุมมุมมองที่นำเสนอแบบโมเดิร์น ...

การนำเสนอโมดอลแบบเลื่อนใหม่ใน iOS 13

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

คำถาม:เราจะปิดการเลิกจ้างแบบโต้ตอบได้อย่างไร - โปรดทราบว่าเราคงรูปแบบการนำเสนอไว้เหมือนเดิม



6
@MehulThakkar นั่นเป็นคำถามที่แตกต่างออกไป
Jakub Truhlář

คำตอบ:


241

ตัวเลือกที่ 1:

viewController.isModalInPresentation = true

ปิดใช้งานการเลิกโต้ตอบแบบโต้ตอบ

(ปิดใช้งานการปิดการโต้ตอบแบบโต้ตอบ.pageSheetจะทำเช่นนี้)

  • ตั้งแต่ iOS 13 UIViewControllerมีคุณสมบัติใหม่ที่เรียกว่าisModalInPresentationซึ่งต้องตั้งค่าเป็นtrueเพื่อป้องกันการปิดการโต้ตอบ
  • โดยทั่วไปจะละเว้นเหตุการณ์ที่อยู่นอกขอบเขตของตัวควบคุมมุมมอง โปรดจำไว้ว่าหากคุณใช้ไม่เพียง แต่ใช้สไตล์อัตโนมัติ แต่ยังรวมถึงรูปแบบการนำเสนอเช่น.popoverอื่น ๆ
  • คุณสมบัตินี้เป็นfalseค่าเริ่มต้น

จากเอกสารอย่างเป็นทางการ : ถ้าtrueUIKit ละเว้นเหตุการณ์ที่อยู่นอกขอบเขตของตัวควบคุมมุมมองและป้องกันการยกเลิกการโต้ตอบของตัวควบคุมมุมมองในขณะที่อยู่บนหน้าจอ


ทางเลือกที่ 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • ตั้งแต่ iOS 13 UIAdaptivePresentationControllerDelegateมีวิธีการใหม่ที่เรียกว่าpresentationControllerShouldDismiss.
  • วิธีการนี้เรียกว่าเฉพาะในกรณีที่นำเสนอมุมมองที่ควบคุมไม่ได้ไล่โปรแกรมและการตั้งค่าคุณสมบัติisModalInPresentationfalse

เคล็ดลับ:อย่าลืมมอบหมายตัวแทนของ presentationController


2
หากตัวควบคุมมุมมองที่นำเสนอเป็นตัวควบคุมการนำทางคุณสามารถตั้งค่าisModalInPresentationบนตัวควบคุมการนำทางหรือบนตัวควบคุมมุมมองแต่ละตัวที่แสดงในสแตกการนำทาง ส่วนหลังช่วยให้คุณเลือกแบบทีละหน้าจอว่าจะปิดการโต้ตอบแบบโต้ตอบได้หรือไม่ ระมัดระวังกับตัวควบคุมการค้นหาโดยจะมีความสำคัญเหนือตัวควบคุมมุมมองแต่ละตัว (แต่ไม่ใช่ตัวควบคุมการนำทาง) ข้อมูลเพิ่มเติมในบล็อกโพสต์ของฉัน: medium.com/@hacknicity/…
Geoff Hackworth

1
โปรดทราบว่าหาก VC ของคุณถูกนำเสนอเป็นป๊อปโอเวอร์สิ่งนี้จะป้องกันไม่ให้ป๊อปโอเวอร์ถูกปิดเมื่อแตะด้านนอก
PatrickDotStar

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

3
ทุกคนสามารถใช้งานได้เมื่อตั้งค่าสถานะนี้บนUIImagePickerController? สำหรับเราดูเหมือนว่าUIImagePickerControllerกำลังเพิกเฉยและสามารถยกเลิกได้ด้วยท่าทางการปัด อาจเป็นข้อผิดพลาดของ iOS 13
PatrickDotStar

4
เมื่อpresentationControllerShouldDismiss(_ presentationController: UIPresentationController)ส่งคืนเท็จpresentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)จะถูกเรียกเพื่อให้คุณสามารถทำสิ่งต่างๆเช่นเพิ่มกล่องโต้ตอบการยืนยันหากผู้ใช้ป้อนข้อมูล
นีล

66
  1. หากคุณต้องการลักษณะการทำงานเช่นเดียวกับใน iOS เวอร์ชันก่อนหน้า (<iOS13) เช่นการนำเสนอแบบจำลองในแบบเต็มหน้าจอเพียงตั้งค่ารูปแบบการนำเสนอของตัวควบคุมมุมมองปลายทางของคุณเป็น UIModalPresentationStyle.fullScreen

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

    และหากคุณใช้สตอรี่บอร์ดเพียงแค่เลือกซีกัวและเลือกFull ScreenจากPresentationเมนูแบบเลื่อนลง

    ใส่คำอธิบายภาพที่นี่

  2. หากคุณเพียงแค่ต้องการที่จะปิดการใช้งานการเลิกจ้างการโต้ตอบและให้ชุดใหม่รูปแบบการนำเสนอUIViewControllerคุณสมบัติที่จะisModalInPresentationtrue

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

ทำงานได้ดีกว่าการใช้ {controller.isModalInPresentation = true}
Maxim Firsoff

8

สถานที่ให้บริการ isModalInPresentationอาจช่วยได้

จากเอกสารประกอบ:

เมื่อคุณตั้งค่าเป็นtrueUIKit จะละเว้นเหตุการณ์ที่อยู่นอกขอบเขตของตัวควบคุมมุมมองและป้องกันการปิดการโต้ตอบของตัวควบคุมมุมมองในขณะที่อยู่บนหน้าจอ

คุณสามารถใช้งานได้ดังนี้:

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

5

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

Attribute Inspector แสดงตัวเลือกการนำเสนอสำหรับตัวควบคุมการนำทาง


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