Ưu điểm, vấn đề, ví dụ về việc thêm UIWindow khác vào ứng dụng iOS?


92

Gần đây tôi đã tự hỏi về thực tế là một ứng dụng iOS chỉ có một UIWindow. Có vẻ như không thành vấn đề khi tạo một cái khác UIWindowvà đặt nó trên màn hình.

Câu hỏi của tôi hơi mơ hồ, nhưng tôi quan tâm đến:

  • Tôi có thể đạt được điều gì với một giây UIWindowmà không thể làm được theo những cách khác?
  • Điều gì có thể xảy ra khi sử dụng nhiều UIWindowphiên bản?
  • Tôi đã thấy rằng mọi người sử dụng thứ hai UIWindowđể hiển thị cửa sổ bật lên giống như chế độ xem trên iPhone. Đây có phải là một cách tốt để làm điều đó? Tại sao? Tại sao không?
  • Có những ví dụ khác mà việc có một UIWindowcái khác là hoàn toàn hợp lý không?

Không phải là tôi đang thiếu thứ gì đó. Tôi chưa bao giờ cảm thấy cần phải tạo một UIWindowphiên bản khác nhưng có lẽ nó sẽ cho phép thực hiện những điều tuyệt vời mà tôi không biết! :-)

Tôi hy vọng rằng nó có thể giúp tôi giải quyết vấn đề này: Tôi cần thêm "chế độ xem bìa" trên bất kỳ thứ gì hiện đang được hiển thị. Nó cũng sẽ hoạt động nếu đã có một hoặc nhiều bộ điều khiển phương thức được trình bày. Nếu tôi thêm a UIViewvào chế độ xem của bộ điều khiển gốc, bộ điều khiển phương thức sẽ nằm trên cùng, bộ điều khiển bật lên cũng vậy. Nếu tôi trình bày chế độ xem bìa theo phương thức và đã có bộ điều khiển theo phương thức, thì chỉ một phần của màn hình bị che.


Sử dụng nhiều UIWindows trong các ứng dụng iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Câu trả lời:


26

A UIWindowcó thể nổi lên trên các phần tử giao diện người dùng khác như bàn phím hệ thống.

Để giải quyết đoạn cuối cùng của bạn: Tạo một UIWindowkhung giống như cửa sổ chính của bạn. Đặt thuộc tính của nó windowLevelthành UIWindowLevelStatusBar. Đặt thuộc tính của nó hiddenthành NO.


Được rồi. Cảm ơn. Tôi biết rằng. Bạn có thể hiểu một chút chi tiết về câu hỏi của tôi không? Bạn có biết cách lấy RID của một giây UIWindow đã được thêm vào bởi makeKeyAndVosystem không?
Krumelur

Đặt thuộc tính ẩn của UIWindow thứ hai thành CÓ.
cướp mayoff

Cảm ơn. Và tôi hiển thị cửa sổ bằng cách làm cho nó trở thành chìa khóa và hiển thị? Và tôi ẩn nó bằng cách hiển thị cửa sổ KHÁC và chỉ loại bỏ cửa sổ kia? Làm cách nào để tạo hiệu ứng cho UIWindow giống như UIActionSheet?
Krumelur

Hãy cẩn thận với điều này. Nếu tại! = UIWindowLevelNormal, bàn phím sẽ hiển thị bên dưới nó trên <iOS7.
Shawn

108

Bắt đầu với câu trả lời của Rob, tôi đã xem xét một chút và muốn viết ra một số ghi chú cho những người khác đang cố gắng lấy thông tin về chủ đề này:

  • Nó không phải là một vấn đề ở tất cả để thêm một khác UIWindow. Chỉ cần tạo một và makeKeyAndVisible. Làm xong.
  • Xóa nó bằng cách hiển thị một cửa sổ khác, sau đó thả một cửa sổ bạn không cần nữa.
  • Cửa sổ là "key" nhận tất cả dữ liệu nhập từ bàn phím.
  • UIWindow bao gồm tất cả mọi thứ, thậm chí cả phương thức, cửa sổ bật lên, v.v. Rực rỡ!
  • UIWindowluôn luôn là chân dung ngầm. Nó không xoay. Bạn sẽ phải thêm bộ điều khiển làm bộ điều khiển gốc của cửa sổ mới và để điều khiển xoay. (Cũng giống như cửa sổ chính)
  • Mức của cửa sổ xác định mức "cao" mà nó được hiển thị. Đặt nó thành UIWindowLevelStatusBarđể nó bao gồm mọi thứ. Đặt thuộc tính của nó hiddenthành KHÔNG.
  • Một thứ hai UIWindowcó thể được sử dụng để đưa các chế độ xem trên màn hình nổi lên trên mọi thứ. Mà không cần tạo một bộ điều khiển giả chỉ để nhúng nó vào a UIPopoverController.
  • Nó có thể đặc biệt hữu ích trên iPhone nơi không có bộ điều khiển bật lên nhưng bạn có thể muốn bắt chước một cái gì đó giống nó.
  • Và vâng, tất nhiên là nó đã giải quyết được vấn đề của tôi: nếu ứng dụng từ chối kích hoạt, hãy thêm một cửa sổ che lên bất kỳ thứ gì hiện đang hiển thị để ngăn iOS chụp ảnh màn hình nội dung hiện tại của ứng dụng của bạn.

Tôi sẽ không có đủ can đảm để sử dụng UIWindow khác nếu không có câu trả lời của bạn. Điều này cũng cực kỳ hữu ích vì UIWindow thứ hai sẽ không tự động chạy theo cách riêng của nó.
Dan Abramov

1
Bài rất ngộ. Nhưng điều gì sẽ xảy ra nếu bạn từ chức cửa sổ này và làm cho khóa cửa sổ bên dưới hiển thị và rootViewController của cửa sổ bên dưới này có một bộ điều khiển phương thức hiện được trình bày? Nó sẽ hiển thị lại bộ điều khiển chế độ xem? Chuyện gì xảy ra trong ứng dụng của chúng tôi là rootViewController được trình bày không phải là một phương thức ...
Nava Carmon

@Krumelur Cái này ổn. Tôi có một nghi ngờ. Có nghĩa là UIWindow thứ 2 được hiển thị trên tất cả các chế độ xem hiện tại. Khi người dùng nhấp vào một nút trên chế độ xem trong UIWindow thứ nhất đang hiển thị thêm một bộ điều khiển chế độ xem. UIWindow thứ 2 này sẽ ẩn. Cách làm cho UIWindow này luôn được hiển thị trong toàn bộ ứng dụng.
Easwaramoorthy K

1
Tôi sử dụng UIWindow mọi lúc để triển khai chế độ xem cảnh báo theo kiểu tùy chỉnh và cửa sổ bật lên trên iphone. Nó giúp luôn đặt chế độ xem toàn màn hình, chứa chế độ xem toàn màn hình và nhúng một "nội dung" khác - chế độ xem bên trong để chế độ xem bên ngoài sẽ bắt được bất kỳ sự kiện chạm nào (và vì vậy tôi có thể thêm bóng đẹp và làm mờ nội dung khác của mình ^^)
Martin Ullrich

3
Cần lưu ý rằng cửa sổ thứ hai không được giữ lại chỉ để hiển thị (trái ngược với các chế độ xem thông thường được giữ lại bởi superview của chúng).
Rivera

0

Đây là Tài liệu của Apple để hiểu rõ hơn về UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Một lý do chính đáng mặc dù cụ thể để sử dụng nhiều phiên bản UIWindow là khi bạn cần quay video màn hình ứng dụng. Bạn có thể không muốn đưa các yếu tố nhất định (nút ghi, trạng thái ghi, v.v.) vào video được ghi cuối cùng, vì vậy bạn có thể đặt các yếu tố đó trong UIWindow riêng biệt ở trên cùng.

Trên thực tế, nếu bạn đang sử dụng ReplayKit, bạn sẽ phải sử dụng UIWindow riêng cho các phần tử UI bị loại trừ này. Thông tin thêm tại đây: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

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.