一. 背景
之前toastView
改版,然后基礎(chǔ)架構(gòu)組的同事重寫了下搪搏,使用過程中發(fā)現(xiàn),加在window
上的toastView
馍乙,竟然被present
出來的登錄頁面給擋住了,基于這個(gè)問題進(jìn)行了分析执虹,并將相應(yīng)的原因記錄下。
二. 定位問題與分析
經(jīng)定位調(diào)試唠梨,我們可以發(fā)現(xiàn)在iOS13
及以上的系統(tǒng)声畏,present
出來的vc
也是直接加載window
上,所以導(dǎo)致了將toastView
覆蓋住姻成。
我們可以看下demo
:
我們?cè)?code>FJFWindowViewController的view
上添加一個(gè)紅色按鈕,點(diǎn)擊present
到FJFPresentViewController
頁面愿棋,然后將一個(gè)黑色view
添加到當(dāng)前應(yīng)用的window
上科展,看下present
出來的FJFPresentViewController
是否會(huì)遮住黑色view
.
從實(shí)驗(yàn)結(jié)果,我們很容易看出糠雨,present
出來的FJFPresentViewController
遮住了黑色的view
才睹。
我們?cè)賮砜匆幌乱晥D的層級(jí),發(fā)現(xiàn)FJFPresentViewController
也是添加到window
上的,而且按照棧的添加順序琅攘,顯示在前面垮庐,所以蓋住了黑色的view
。
我們從打印的日志也可以看出來:
這是iOS13
及以上系統(tǒng)會(huì)這樣坞琴,那如果是iOS13
一下系統(tǒng)是怎樣的呢哨查?
我們選中iOS11.4
的模擬器系統(tǒng):
我們可以看到present
出來的FJFPresentViewController
顯示在黑色view
下面。
我們?cè)賮砜聪乱晥D的層級(jí):
從這個(gè)視圖的層級(jí)看剧辐,黑色視圖是在FJFPresentViewController
下面寒亥,但實(shí)際顯示黑色view
確顯示在上面,所以可能是xcode
的這個(gè)視圖層級(jí)有問題荧关。
于是我們通過代碼打印window
的子視圖數(shù)組溉奕,看下真正的順序是怎樣的。
我們可以看到黑色view
是顯示最上面的忍啤,這跟實(shí)際的結(jié)果正好相符合加勤。
三. 總結(jié)
-
在iOS13
及以上系統(tǒng),之所以會(huì)出現(xiàn)present
出來的vc
擋住了加載window
上的toastView
,原因在于iOS13
及以上系統(tǒng),present
出來的vc
,也是單獨(dú)加載window
上導(dǎo)致的同波,因?yàn)?code>iOS13及以上系統(tǒng)鳄梅,present
添加了半彈框的樣式,所以將present
出來的vc
添加方式做了修改参萄,直接添加到window
上卫枝。 -
iOS13
以下的系統(tǒng),由于present
出來的vc
都是直接蓋住當(dāng)前視圖讹挎,沒有半彈框的樣式校赤,所以present
出來的vc
是直接替換了原來的navigationVc
,而添加到window
上的toastView
筒溃,依然顯示在最前方马篮。
四. 解決方法
- 如果想讓toastView顯示在最前方,可以通過
window
的bringSubviewToFront
將toastView
顯示在最前方怜奖。