轉載請注明出處,保留原帖位址及作者署名.
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的API很簡單,
提供一套預設的顯示和隐藏方法
核心在于hideWithCustomBlock來自定義更多隐藏插畫的方式.
希望有人能夠pull request 很棒的自定義隐藏代碼!
小技巧:
1.如何全屏展示啟動插畫(隐藏狀态欄那種)?
勾上即可!
2.如何在展示完成以後又立刻恢複狀态欄的顯示?
總結:
部落客本人已對此功能進行封裝,基本上不需要關心核心功能的實作,那為什麼還要費一大半勁去闡述原理?
因為該功能在于如何利用UIWindow去實作,或者說我們想把頂部狀态欄更好的掌控在手中,那麼了解UIWindow是首當其沖!
閱讀完本文以後有任何疑問,都務必說出來,不想注冊csdn賬号的,可以通過微網誌私信我,這是我持續改進文章内容的主要方式. 謝謝!