1. 程式人生 > >新增多個UIWindow時,使用keyWindow要注意一點

新增多個UIWindow時,使用keyWindow要注意一點

最近的專案裡有個關於建立多個uiwindow時使用keywindow出現的bug。

有個任務是在開啟資訊展示時,要求不被任何東西遮擋。這裡設計方案是新增一個新的HXUIWindow繼承與UIWindow。測試時打開了HXUIWindow顯示在螢幕上,執行開啟 彈框 按鈕(uiactionsheet或uialerview),當彈框消失後,再執行向主頁最外層新增一個view,這個時候應該會想到用[[UIApplication sharedApplication].keyWindow addSubview:view],這個時候問題出現了,程式將view新增到了HXUIWindow上,而HXUIwindow大小隻有100*100,所以超出的內容沒有點選事件。

這是為什麼呢?因為這個時候[UIApplication sharedApplication].keyWindow 是HXUIWindow而不是程式最開始預設的那個[[[UIApplication sharedApplication] delegate] window]。這又是為什麼呢,因為這裡執行了開啟 彈框 按鈕(uiactionsheet或uialerview),當開啟(uiactionsheet或uialerview)時,程式為了讓彈框出現在最外層,會新建一個臨時的uiwindow,並且層級最高,還將keywindow賦值與它。當彈框消失後keywindow將轉向另一個uiwindow,這個時候轉向了HXUIWindow,因為HXUIWindow層級最高,在windows裡層級拍最後面。剛開始的時候只有[[[UIApplication sharedApplication] delegate] window],所以其為keywindow,當然也是有因為設定為keywindow的原因,只有新增HXUIWindow時沒有改變keywindow的值,當彈窗彈出後keywindow會將指向彈框彈出後新建的uiwindow,彈窗消失時keywindow又將重新指向,這個時候其會將指向層級最高的uiwindow,所以指向了HXUIWindow了。

總結:

1.經過測試keyWindow永遠是覆蓋在檢視的最外層,在正常情況下獲取到的keyWindow是UIWindow;

 2.在有UIAlertView或UIActionSheet的彈出層情況下,在去獲取keyWindow這個時keyWindow就會變成UIAlertControllerShimPresenterWindow這個類,是彈出層上層的一個window;

3.在UIAlertView或UIActionSheet彈出後再給keyWindow新增的view,會在UIAlertView彈出層消失後,keyWindow上邊的檢視也會隨之消失;

4.會在UIAlertView彈出層消失後,keyWindow指向檢視最外層的HXUIWindow了,之後新增到[[UIApplication sharedApplication].keyWindow 上的uiview都將新增到HXUIWindow上了;


相關推薦

增多UIWindow使用keyWindow注意一點

最近的專案裡有個關於建立多個uiwindow時使用keywindow出現的bug。有個任務是在開啟資訊展示時,要求不被任何東西遮擋。這裡設計方案是新增一個新的HXUIWindow繼承與UIWindow。測試時打開了HXUIWindow顯示在螢幕上,執行開啟 彈框 按鈕(ui

百度地圖 迴圈載入marker並增多資訊視窗解決只顯示最後一個視窗資訊的問題

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShowNurseryInfo.aspx.cs"     Inherits="Bim5D_Web.Nursery.ShowNurseryInfo" %> <!DOCTY

oracle 一個表增多欄位根據條件重新整理欄位值

2. Oracleupdate TA a set(name, remark)=(select b.name, b.remark from TB b where b.id=a.id)   where exists(select 1 from TB b where b.id=a.

無線網路覆蓋-java中用Math.sqrt()必須注意小數問題

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3 描述 我們的樂樂同學對於網路可算得上是情有獨鍾,他有一個計劃,那就是用無線網覆蓋鄭州大學。 現在學校給了他一個機會,因此他要購買很多的無線路由。現在他正在部署某條大道的網路,而學校只允許把他的無線路由器放在路的正中間。我們預設這條大道

ios開發在Xcode中增多targets進行版本控制管理多相同內容的專案

 在ios開發時,我們經常會遇到對同一個app開發多個版本(Pro、Lite、Free)的情況,這裡就涉及到xcode裡通過新增多個targets來進行版本控制的問題了,下面就簡單說明一下: 點選左側的工程名稱,右側會出現PROJECT和TARGETS,點選你現在的target,假如叫A,右鍵彈出選單中,選擇

python 列表list和字典dict同時增多分別用extend、update方法:

>>> d = [2,3,4] >>> e = [1,2,3] >>> d.extend(e)  # 用列表用extend()方法 >>> d [2, 3, 4, 1, 2, 3]   >>&

封裝RecyclerView Adapter 實現可增多header和footer,可設定loadingView低耦合的多種佈局。

多種佈局的recyclerview的普通寫法是重寫RecyclerView.Adapter的getItemViewType返回不同position上的type,在onCreateViewHolder(ViewGroup parent,int viewType

C#word模板增多表格新增圖片程式案例

  public string CreateWordFile(string CheckedInfo)         {             string message = "";             try             {              

innosetup多語言選擇增多

其實很簡單: [Languages] Name: "chinesesimp"; MessagesFile: "compiler:Default.isl" Name: "english"; MessagesFile: "compiler:Languages\Englis

通過javaMail傳送郵件可選增多收件人密送抄送附件,超實用

        自己通過學習多人的程式碼,並整理了一個簡單,呼叫方便的通過javaMail傳送郵件。只需填寫發件郵箱地址,密碼;收件人地址,附件,選擇是否儲存,設定自己傳送郵件時的暱稱就ok了。程式碼自動匹配設定smtp服務地址和埠。    傳送郵件需要郵箱地址和密碼,開啟P

iOS開發tableView側滑刪除的實現或者增多側滑顯示按鈕

如果想要實現簡單的刪除操作,1 + 2 + 4方法就可以實現 ,如果你要滑動出現多個操作按鈕的話,就要實現方法5了,第五個方法說白了就是集合了前幾個方法,而且可以新增多個按鈕,如果用第5個方法,1、2、4方法可以不實現 //1 - (BOOL)tableView:(UITa

VS2015基礎 在同一解決方案下增多專案

       慈心積善融學習,技術願為有情學。善心速造多好事,前人栽樹後乘涼。我今於此寫經驗,願見文者得啟發。剛開始的時候,是這樣的。解決方案管理器找不到的話,可以通過下面的方式開啟儲存該解決方案的資料

java 中List包含List如何增多list,Map中包含多list如何新增?

1、List中新增list public class TestList { public static void main(String[] args) { List<List<Integer>> vecvecRes = new ArrayLi

Easyui 繫結左側選單右側顯示內容動態增多tab

老規矩還是先上圖看效果:左側選單,右側展示內容以及title 接著看前臺jsp程式碼:前臺程式碼很簡單,按照官方的要求寫就可以,重點是紅色框裡別忘了加最後一步就是js繫結事件在這裡我給出程式碼需要的同學直接copy,這裡是onclick()點選事件,資料為測試資料,替換自己真

OSG中增多物體 OSG::Group的使用

之前的文章可以針對單個物體,進行平移,旋轉,縮放。 現在我想在場景中放置兩頭牛。在OSG中,放置多個物體,可以將這個多個物體放置到一個Group中,然後再將場景設定成這個Group,就可以了。 #include<osgViewer/Viewer> #inc

接到數據庫分析業務常用的SQL語句

增加 臨時 columns != question 名稱 信息 語句 insert USE DataBaseName--清空當前GridView顯示,釋放內存: SELECT GETDATE() --數據庫關系圖 SELECT * FROM sysdiagra

MySQL索引使用:字段為varchar類型條件使用''包起來

row prim was OS con xtra str fault 建表語句 結論: 當MySQL中字段為int類型時,搜索條件where num=‘111‘ 與where num=111都可以使用該字段的索引。當MySQL中字段為varchar類型時,搜索條件whe

一個DOM元素綁定多事件先執行冒泡還是捕獲

msg 元素 .org tro code 常見 xxx == 添加 綁定在被點擊元素的事件是按照代碼順序發生,其他元素通過冒泡或者捕獲“感知”的事件,按照W3C的標準,先發生捕獲事件,後發生冒泡事件。所有事件的順序是:其他元素捕獲階段事件 -> 本元素代碼順序事件 -

當虛擬機崩潰怎麽做

blog usr 硬盤容量 tails 鏡像 而是 font snapshot 啟動 使用虛擬機做嵌入式開發,千萬不要一整個盤掛載到/root,如果你這樣做了,這絕對是噩夢的伏筆。 IF( 你的虛擬機不幸崩潰了 ) { 第一步:不要慌張 當你的虛擬機崩潰無

centos批量增多IP地址

在/etc/sysconfig/network-scripts/中新建檔案ifcfg-eth0-range0   vi /etc/sysconfig/network-scripts/ifcfg-eth0-range0   輸入以下檔案內容格式: &nb