轉載請註明出處,保留原帖地址及作者署名.
Url:http://blog.csdn.net/ysy441088327/article/details/8852304
Author:餘書懿
引言:
精華執行個體是博主我新開設的一個專題,這個專題主要介紹一些在iOS應用中非常值得實踐的例子.
歡迎大家轉載和傳播,但請保留原著出處.因為我隨時可能會更新以及錯誤修正.
我希望每一個閱讀精華執行個體的開發人員能夠從中受益,並且熟練的運用這些技巧.
那麼作為你們呢,在閱讀完這篇文章以後,請盡量留下你的建議和看法. 這是我持續改進文章的一個主要方式.
精華執行個體的章節到底會有多少篇,這個我也很難預料,不過只要是我認為值得寫的,我都會寫出來. 讓大家共同學習和成長!
開篇的廢話比較多,下面開始進入本文:
什麼是App啟動插畫的自訂過度?
我們都知道,App在啟動的時候,會展示一張App啟動插畫來保證App程式載入的等待體驗,讓使用者欣賞美麗的插畫時,App真正默默的努力載入著相關資源,
App自動調用main函數,接著是:didFinishLaunchingWithOptions
當UIWindow執行makeKeyAndVisible時,那麼這張啟動插圖就會自動消失了.但卻是瞬間消失的.
而所謂的自訂過度就是讓啟動插圖更加友好的消失(而不是瞬間沒了),相信在很多主流App產品中已經看到不少這樣的效果.
那麼這個實現方式就是本文要討論的重點!
程式原理是?
程式有時也會有點魔術的感覺,在你不知道原理的時候總感覺它很神秘!
App啟動插畫我們通過工程設定-targets-Summary-Launch Images 來設定.
但是這個啟動插畫的指標我們是擷取不到的.(要是擷取到了,這篇文章估計很短,甚至沒有.)
那怎麼辦呢? 我們肯定要有這個指標,才能去實現自訂的過度,例如一點一點的消失啊,翻一頁書那樣的效果等等.
出於我們的目的,我們只有自己alloc一個UIImageView了,其載入的圖片就是我們啟動插畫的圖片.
但是要保證一點:啟動插畫展示的是什麼樣子,我們自己alloc 的UIImageView也應該是什麼樣子, 不然,這個體驗就大打折扣了 你說呢?
而這個UIImageView我們到底應該addSubview在哪裡是本執行個體的一個技術痛點.
那答案是什麼?
是UIWindow!卻不是keyWindow.而是一個需要我們自己alloc的UIWindow! 但是它的windowLevel要比keyWindow高一級!
也就是說,為了讓UIImageView順利的展示出來並保證與啟動插畫的樣子一摸一樣,我們需要有一個UIWindow的容器.代碼如下:
UIWindow是一個很神奇的類,當你alloc出來並把windowLevel設定比keyWindow的level高以後,此時不再需要額外的執行makeKeyAndVisible或者addSubview來讓這個UIWindow顯示出來.
但是這個UIWindow的hidden屬性卻預設是YES, 所以我們需要將hidden設定為NO! 讓UIWindow真正顯示出來.
那麼接下來把我們的UIImageView調用addSubview到這個UIWindow上面.
而alloc UIImageView時 有一點我們需要注意一下:
不要通過imageNamed的方式去獲得UIImage, 大家都應該知道imageNamed是會自動把載入過的圖片資源緩衝起來,如果下次再調用同名稱的圖片,是直接從記憶體中獲得,而我們的這個UIImageView只使用一次,當插畫隱藏以後不再需要重複使用.
那正確的擷取方式是什麼?
以絕對路徑的方式獲得這張圖片資源,就像下面這樣:
imageWithContentsOfFile是符合我們現在使用圖片資源的需求,因為它在使用完成以後會自動清理掉(ARC)
到此,我們的偽裝版啟動插圖已經部署完成.
何時調用呢?
在第一個啟動的ViewController中的viewWillAppear執行這些代碼.那麼不出意外的話,啟動插畫永遠的顯示了出來.
但是我們不是要一直顯示啊,差不多它就應該消失了,只是說消失的時候更加友好一些!
因為我們已經有了UIImageView的指標了,接下來我們可以隨意控制這個UIImageView消失的方式.
也就達到了本文的目的:
App啟動插畫的自訂過度
而博主我對於這項執行個體功能封裝了一個類來方便調用! 已經上傳到Github上. 歡迎大家使用並反饋問題.
它的名字叫:SYAppStart
SYAppStart的API很簡單,
提供一套預設的顯示和隱藏方法
核心在於hideWithCustomBlock來自訂更多隱藏插畫的方式.
希望有人能夠pull request 很棒的自訂隱藏代碼!
小技巧:
1.如何全屏展示啟動插畫(隱藏狀態列那種)?
勾上即可!
2.如何在展示完成以後又立刻恢複狀態列的顯示?
總結:
博主本人已對此功能進行封裝,基本上不需要關心核心功能的實現,那為什麼還要費一大半勁去闡述原理?
因為該功能在於如何利用UIWindow去實現,或者說我們想把頂部狀態列更好的掌控在手中,那麼理解UIWindow是首當其衝!
閱讀完本文以後有任何疑問,都務必說出來,不想註冊csdn帳號的,可以通過微博私信我,這是我持續改進文章內容的主要方式. 謝謝!