Keuntungan, masalah, contoh menambahkan UIWindow lain ke aplikasi iOS?

92

Baru-baru ini saya bertanya-tanya tentang fakta bahwa aplikasi iOS hanya memiliki satu UIWindow. Tampaknya tidak menjadi masalah untuk membuat yang lain UIWindowdan meletakkannya di layar.

Pertanyaan saya agak kabur, tapi saya tertarik pada:

  • Apa yang berpotensi saya capai dengan satu detik UIWindowyang tidak dapat dilakukan dengan cara lain?
  • Apa yang salah saat menggunakan banyak UIWindowcontoh?
  • Saya telah melihat bahwa orang menggunakan detik UIWindowuntuk menampilkan popover seperti tampilan di iPhone. Apakah ini cara yang baik untuk melakukannya? Mengapa? Kenapa tidak?
  • Apakah ada contoh lain di mana sangat masuk akal untuk memiliki yang lain UIWindow?

Bukannya aku melewatkan sesuatu. Saya tidak pernah merasa perlu untuk membuat UIWindowcontoh lain tetapi mungkin itu akan memungkinkan melakukan hal-hal luar biasa yang tidak saya sadari! :-)

Saya berharap ini dapat membantu saya memecahkan masalah ini: Saya perlu menambahkan "tampilan sampul" pada apa pun yang sedang ditampilkan. Ini juga harus berfungsi jika sudah ada satu atau lebih pengontrol modal yang disajikan. Jika saya menambahkan a UIViewke tampilan pengontrol root, pengontrol modal duduk di atas, begitu juga pengontrol popover. Jika saya menampilkan tampilan sampul secara sederhana dan sudah ada pengontrol modal, hanya sebagian dari layar yang tertutup.

Krumelur
sumber
Menggunakan beberapa UIWindows dalam aplikasi iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Jawaban:

27

A UIWindowdapat melayang di atas elemen UI lainnya seperti keyboard sistem.

Untuk mengatasi paragraf terakhir Anda: Buatlah UIWindowdengan bingkai yang sama dengan jendela utama Anda. Setel windowLevelpropertinya ke UIWindowLevelStatusBar. Setel hiddenpropertinya ke NO.

merampok mayoff
sumber
Err, baiklah. Terima kasih. Saya tahu itu. Bisakah Anda mendapatkan sedikit detail tentang pertanyaan saya? Apakah Anda tahu cara mendapatkan RID detik UIWindow yang ditambahkan oleh makeKeyAndVisible?
Krumelur
Setel properti tersembunyi kedua UIWindow ke YES.
merampok mayoff
Terima kasih. Dan saya menunjukkan jendela dengan membuatnya menjadi kunci dan terlihat? Dan saya menyembunyikannya dengan membuat jendela LAIN terlihat dan hanya membuang yang lain? Bagaimana saya bisa menganimasikan UIWindow seperti UIActionSheet melakukannya?
Krumelur
Hati-hati dengan ini. Jika di! = UIWindowLevelNormal, keyboard akan ditampilkan di bawahnya di <iOS7.
Shawn
108

Dimulai dengan jawaban Rob, saya bermain-main sedikit dan ingin menuliskan beberapa catatan untuk orang lain yang mencoba mendapatkan informasi tentang topik ini:

  • Tidak masalah sama sekali untuk menambahkan yang lain UIWindow. Buat saja satu dan makeKeyAndVisible. Selesai.
  • Hapus dengan membuat jendela lain terlihat, lalu lepaskan yang tidak Anda butuhkan lagi.
  • Jendela yang merupakan "kunci" menerima semua masukan keyboard.
  • UIWindow mencakup semuanya, bahkan modal, popovers, dll. Brilian!
  • UIWindowselalu potret secara implisit. Itu tidak berputar. Anda harus menambahkan pengontrol sebagai pengontrol root jendela baru dan membiarkannya menangani rotasi. (Sama seperti jendela utama)
  • Level jendela menentukan seberapa "tinggi" itu ditampilkan. Atur agar UIWindowLevelStatusBarmencakup semuanya. Set hiddenpropertinya ke NO.
  • A 2nd UIWindowdapat digunakan untuk menghadirkan tampilan di layar yang melayang di atas segalanya. Tanpa membuat pengontrol tiruan hanya untuk menyematkannya di file UIPopoverController.
  • Ini bisa sangat berguna pada iPhone di mana tidak ada pengontrol popover tetapi di mana Anda mungkin ingin meniru sesuatu seperti itu.
  • Dan ya, tentu saja itu menyelesaikan masalah saya: jika aplikasi mengundurkan diri dari aktivasi, tambahkan jendela sampul di atas apa pun yang saat ini ditampilkan untuk mencegah iOS mengambil tangkapan layar dari konten aplikasi Anda saat ini.
Krumelur
sumber
Saya tidak akan memiliki keberanian untuk menggunakan UIWindow lain jika bukan karena jawaban Anda. Ini juga sangat membantu karena UIWindow kedua tidak akan melakukan rotasi otomatis sendiri.
Dan Abramov
1
Posting yang sangat mencerahkan. Tetapi apa yang terjadi jika Anda mengundurkan diri jendela ini dan membuat kunci jendela yang mendasarinya dan terlihat dan rootViewController jendela yang mendasari ini memiliki pengontrol modal yang saat ini disajikan? Apakah itu akan menampilkan kembali pengontrol tampilan modal? Apa yang terjadi dalam aplikasi kita adalah bahwa rootViewController disajikan bukan modal ...
Nava Carmon
@Krumelur Ini bagus. Saya ragu. Misalnya, UIWindow ke-2 ditampilkan di atas semua tampilan saat ini. Ketika pengguna mengklik satu tombol pada tampilan yang ada di UIWindow 1 yang menampilkan satu lagi viewcontroller. UIWindow kedua ini akan bersembunyi. Cara membuat UIWindow ini selalu ditampilkan di seluruh aplikasi.
Easwaramoorthy K
1
Saya menggunakan UIWindow sepanjang waktu untuk mengimplementasikan tampilan peringatan bergaya kustom dan popovers iphone. Ini membantu selalu membuat tampilan layar penuh, berisi tampilan layar penuh dan menyematkan "konten" lain -view ke dalam sehingga tampilan luar akan menangkap peristiwa sentuh apa pun (sehingga saya dapat menambahkan bayangan yang bagus dan meredupkan konten saya yang lain ^^)
Martin Ullrich
3
Perlu dicatat bahwa jendela kedua tidak dipertahankan hanya karena terlihat (berbeda dengan tampilan biasa yang dipertahankan oleh superview mereka).
Rivera
0

Berikut adalah Dokumentasi Apple untuk pemahaman yang lebih baik tentang UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Salah satu alasan yang bagus meskipun spesifik untuk menggunakan beberapa contoh UIWindow adalah ketika Anda perlu merekam video layar aplikasi. Anda mungkin tidak ingin memasukkan elemen tertentu (tombol perekaman, status perekaman, dll.) Dalam rekaman video akhir, sehingga Anda dapat meletakkan elemen-elemen tersebut di UIWindow terpisah di atas.

Faktanya, jika Anda menggunakan ReplayKit, Anda harus menggunakan UIWindow terpisah untuk elemen UI yang dikecualikan ini. Info lebih lanjut di sini: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

Ivy Xing
sumber