關(guān)于啟動(dòng)頁面的一點(diǎn)思考

制作炫酷的啟動(dòng)界面一直是產(chǎn)品的追求,但很遺憾的是iOS不能完全做到這一點(diǎn),我所已知的最好的解決方案是在didFinishLaunch方法里獲取啟動(dòng)頁面的圖片作為動(dòng)畫的第一幀形成連貫的動(dòng)畫,但動(dòng)態(tài)的更換第一幀的App我是沒有見到的。

那么能不能更換動(dòng)態(tài)的啟動(dòng)頁面呢,我谷歌了一些國外開發(fā)者論壇,答案依然是沒有找到。這時(shí)我想到hook。runtime里面方法交換能否幫助到我呢,我使用的是LaunchScreen.storyboad作為啟動(dòng)頁,里面設(shè)置了全屏的UIImageView。

1、先嘗試使用自定義UIImageView的子類,結(jié)果是編譯報(bào)錯(cuò),Apple不允許在啟動(dòng)storyboard中使用自定義UI類。然后我創(chuàng)建UIImageView的分類,并重寫+ (void)load方法。
結(jié)論是:hook不到啟動(dòng)圖,我先后hook了initWithImage,setImage:都沒有效果。
2、嘗試hookUIImage,先后hook了imageNamed:,imageNamed:inBundle:等方法,依然沒有效果,最后不死心的我,hookUIStoryboard的方法,很顯然都沒有效果,難道storyboard的底層并沒有使用runtime的消息機(jī)制。很顯然不是,使用其他的storyboard hook都有捕捉到,到底哪里出問題了呢。
3、我嘗試在load方法處設(shè)置斷點(diǎn),神奇的出現(xiàn)了。啟動(dòng)圖先出現(xiàn),然后再進(jìn)入斷點(diǎn),這令我有些不知所措,啟動(dòng)圖竟然比load都早,難道他比runtime都早嗎。這顯然runtime是管不了它了。

結(jié)論:launchScreen.board的啟動(dòng)時(shí)機(jī)非常早,早于load,更不用說main,didFinishLaunch了,它的作用是app初始化時(shí)諸如:dyld鏈接,鏡像加載,runtime的運(yùn)行等一系列耗時(shí)操作的遮罩美化,它運(yùn)行的太早了,具體是在什么時(shí)機(jī),水平有限,我也不得而知。所以想要通過代碼動(dòng)態(tài)的修改,有點(diǎn)癡人說夢(mèng)。但有一點(diǎn)或許可以做到,使用fishhook或許可以做到,但需要更多的底層的api。回過頭來想,為什么launchScreen不能使用自定義類,而且創(chuàng)建Storyboard文件時(shí)會(huì)有普通storyboard和launchScreen兩個(gè)選項(xiàng),它確實(shí)不是普通的storyboard。最后補(bǔ)充一點(diǎn),apple對(duì)啟動(dòng)圖做了緩存處理,在第一次啟動(dòng)后,會(huì)在splashBoard這個(gè)目錄緩存一張啟動(dòng)圖,如果出現(xiàn)更換啟動(dòng)圖沒有效果,可以嘗試清除這個(gè)目錄的圖片,具體怎么操作,百度一下即可,我有點(diǎn)懶,就不貼代碼了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容