ข้อดีปัญหาตัวอย่างการเพิ่ม UIWindow อื่นในแอป iOS?


92

เร็ว ๆ นี้ผมได้รับการสงสัยเกี่ยวกับความจริงที่ว่าแอป iOS UIWindowมีเพียงหนึ่ง ดูเหมือนจะไม่ใช่ปัญหาในการสร้างใหม่UIWindowและวางไว้บนหน้าจอ

คำถามของฉันค่อนข้างคลุมเครือ แต่ฉันสนใจที่จะ:

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

ไม่ใช่ว่าฉันขาดอะไรไป ฉันไม่เคยรู้สึกว่าต้องสร้างUIWindowอินสแตนซ์อื่นแต่บางทีมันอาจจะช่วยให้ทำสิ่งที่น่าอัศจรรย์ที่ฉันไม่รู้ได้! :-)

ฉันหวังว่ามันจะช่วยฉันแก้ปัญหานี้ได้: ฉันต้องเพิ่ม "มุมมองหน้าปก" เหนือสิ่งที่แสดงอยู่ในปัจจุบัน นอกจากนี้ควรใช้งานได้หากมีตัวควบคุมโมดอลหนึ่งตัวหรือมากกว่านั้นที่นำเสนออยู่แล้ว ถ้าฉันเพิ่ม a UIViewลงในมุมมองของตัวควบคุมรูทตัวควบคุมโมดอลจะอยู่ด้านบนดังนั้นตัวควบคุมป๊อปโอเวอร์ก็ทำเช่นกัน หากฉันนำเสนอมุมมองปกแบบโมดอลและมีตัวควบคุมโมดอลอยู่แล้วจะมีการปิดหน้าจอเพียงบางส่วนเท่านั้น


การใช้ UIWindows หลายตัวในแอปพลิเคชัน iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

คำตอบ:


27

A UIWindowสามารถลอยอยู่เหนือองค์ประกอบ UI อื่น ๆ เช่นแป้นพิมพ์ระบบ

ในการระบุย่อหน้าสุดท้ายของคุณ: สร้างUIWindowกรอบเดียวกับหน้าต่างหลักของคุณ ชุดของคุณสมบัติการwindowLevel UIWindowLevelStatusBarชุดของคุณสมบัติการhiddenNO


เอ่อไม่เป็นไร ขอบคุณ. ฉันรู้ว่า. คุณขอทราบรายละเอียดเกี่ยวกับคำถามของฉันได้ไหม คุณรู้วิธีรับ RID ของ UIWindow วินาทีที่เพิ่มโดย makeKeyAndVisible หรือไม่?
Krumelur

ตั้งค่าคุณสมบัติที่ซ่อนอยู่ของ UIWindow ที่สองเป็นใช่
rob mayoff

ขอบคุณ. และฉันจะแสดงหน้าต่างโดยทำให้เป็นกุญแจและมองเห็นได้? และฉันซ่อนมันโดยการทำให้หน้าต่างอื่นมองเห็นได้และเพียงแค่กำจัดอีกหน้าต่าง? ฉันจะทำให้ UIWindow เคลื่อนไหวเหมือน UIActionSheet ได้อย่างไร
Krumelur

ระวังเรื่องนี้ด้วย หากอยู่ที่! = UIWindowLevelNormal แป้นพิมพ์จะแสดงด้านล่างบน <iOS7
Shawn

108

เริ่มต้นด้วยคำตอบของ Rob ฉันเล่นไปสักพักและอยากจะเขียนบันทึกสำหรับคนอื่น ๆ ที่พยายามหาข้อมูลในหัวข้อนี้:

  • UIWindowมันไม่ได้เป็นปัญหาที่ทุกคนจะเพิ่มอีก เพียงสร้างหนึ่งและmakeKeyAndVisible. เสร็จแล้ว
  • ลบออกโดยทำให้หน้าต่างอื่นมองเห็นได้จากนั้นปล่อยหน้าต่างที่คุณไม่ต้องการอีกต่อไป
  • หน้าต่างที่เป็น "แป้น" รับอินพุตแป้นพิมพ์ทั้งหมด
  • UIWindow ครอบคลุมทุกอย่างแม้กระทั่งโมดอลป๊อปโอเวอร์ ฯลฯ สุดยอด!
  • UIWindowมักจะเป็นแนวตั้งโดยปริยายเสมอ มันไม่หมุน คุณจะต้องเพิ่มคอนโทรลเลอร์เป็นตัวควบคุมรูทของหน้าต่างใหม่และปล่อยให้มันจัดการการหมุน (เช่นเดียวกับหน้าต่างหลัก)
  • ระดับของหน้าต่างจะกำหนดว่าจะแสดง "สูง" เพียงใด ตั้งค่าให้UIWindowLevelStatusBarมันครอบคลุมทุกอย่าง ตั้งค่าhiddenคุณสมบัติเป็น NO
  • ตัวที่ 2 UIWindowสามารถใช้เพื่อนำมุมมองบนหน้าจอที่ลอยอยู่ด้านบนของทุกสิ่ง โดยไม่ต้องสร้างตัวควบคุมดัมมี่เพียงเพื่อฝังไว้ในไฟล์UIPopoverController.
  • จะมีประโยชน์อย่างยิ่งบน iPhone ที่ไม่มีตัวควบคุมป๊อปโอเวอร์ แต่คุณอาจต้องการเลียนแบบบางอย่างเช่นนี้
  • และใช่มันแก้ไขปัญหาของฉันได้แน่นอน: หากแอปหยุดการเปิดใช้งานให้เพิ่มหน้าต่างปิดทับสิ่งที่แสดงอยู่ในปัจจุบันเพื่อป้องกันไม่ให้ iOS จับภาพหน้าจอของเนื้อหาปัจจุบันของแอปของคุณ

ฉันคงไม่มีความกล้าที่จะใช้ UIWindow อื่นถ้าไม่ใช่เพื่อคำตอบของคุณ สิ่งนี้มีประโยชน์อย่างยิ่งเนื่องจาก UIWindow ที่สองจะไม่ทำงานอัตโนมัติด้วยตัวเอง
Dan Abramov

1
โพสต์ที่กระจ่างแจ้งมาก แต่จะเกิดอะไรขึ้นถ้าคุณลาออกจากหน้าต่างนี้และสร้างคีย์หน้าต่างที่อยู่ข้างใต้และมองเห็นได้และ rootViewController ของหน้าต่างที่อยู่ภายใต้นี้มีตัวควบคุมโมดอลที่นำเสนออยู่ในปัจจุบัน? มันจะนำเสนอตัวควบคุมมุมมองโมดอลกลับมาหรือไม่? สิ่งที่เกิดขึ้นในแอปพลิเคชันของเราคือ rootViewController ไม่ได้ถูกนำเสนอเป็นรูปแบบหนึ่ง ...
Nava Carmon

@Krumelur นี่สบายดีนะ ฉันมีข้อสงสัย กล่าวคือ UIWindow ที่ 2 แสดงอยู่ด้านบนของมุมมองปัจจุบันทั้งหมด เมื่อผู้ใช้คลิกปุ่มเดียวบนมุมมองซึ่งอยู่ใน UIWindow ที่ 1 ซึ่งกำลังนำเสนอวิวคอนโทรลเลอร์อีกหนึ่งตัว UIWindow ที่ 2 นี้จะซ่อน วิธีทำให้ UIWindow นี้แสดงตลอดทั้งแอพ
Easwaramoorthy K

1
ฉันใช้ UIWindow ตลอดเวลาเพื่อปรับใช้มุมมองการแจ้งเตือนแบบกำหนดเองและป๊อปโอเวอร์ของ iPhone ช่วยให้มุมมองเต็มหน้าจอมีมุมมองแบบเต็มหน้าจอและฝัง "เนื้อหา" อื่นไว้ด้านในเพื่อให้มุมมองด้านนอกจับภาพเหตุการณ์ที่สัมผัสได้ (และฉันจึงสามารถเพิ่มเงาที่สวยงามและทำให้เนื้อหาอื่น ๆ ของฉันมืดลงได้ ^^)
Martin Ullrich

3
ควรสังเกตว่าหน้าต่างที่สองไม่ได้ถูกเก็บไว้เพียงเพื่อให้มองเห็นได้ (ตรงกันข้ามกับมุมมองปกติที่เก็บไว้โดย superview)
ริเวร่า

0

นี่คือเอกสารของ Appleเพื่อความเข้าใจ UIWindow ที่ดีขึ้น: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

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

ในความเป็นจริงหากคุณใช้ ReplayKit คุณจะต้องใช้ UIWindow แยกต่างหากสำหรับองค์ประกอบ UI ที่ยกเว้นเหล่านี้ ข้อมูลเพิ่มเติมที่นี่: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

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