天天看點

iOS精華執行個體之App啟動插畫的自定義過度

轉載請注明出處,保留原帖位址及作者署名.

Author:餘書懿

引言:

精華執行個體是部落客我新開設的一個專題,這個專題主要介紹一些在iOS應用中非常值得實踐的例子.

歡迎大家轉載和傳播,但請保留原著出處.因為我随時可能會更新以及糾錯.

我希望每一個閱讀精華執行個體的開發者能夠從中受益,并且熟練的運用這些技巧. 

那麼作為你們呢,在閱讀完這篇文章以後,請盡量留下你的建議和看法. 這是我持續改進文章的一個主要方式.

精華執行個體的章節到底會有多少篇,這個我也很難預料,不過隻要是我認為值得寫的,我都會寫出來. 讓大家共同學習和成長!

開篇的廢話比較多,下面開始進入正文:

什麼是App啟動插畫的自定義過度?

我們都知道,App在啟動的時候,會展示一張App啟動插畫來保證App程式加載的等待體驗,讓使用者欣賞美麗的插畫時,App真正默默的努力加載着相關資源,

App自動調用main函數,接着是:didFinishLaunchingWithOptions

當UIWindow執行makeKeyAndVisible時,那麼這張啟動插圖就會自動消失了.但卻是瞬間消失的.

而所謂的自定義過度就是讓啟動插圖更加友好的消失(而不是瞬間沒了),相信在很多主流App産品中已經看到不少這樣的效果.

那麼這個實作方式就是本文要讨論的重點!

程式原理是?

程式有時也會有點魔術的感覺,在你不知道原理的時候總感覺它很神秘!

App啟動插畫我們通過工程設定-targets-Summary-Launch Images 來設定.

iOS精華執行個體之App啟動插畫的自定義過度

但是這個啟動插畫的指針我們是擷取不到的.(要是擷取到了,這篇文章估計很短,甚至沒有.)

那怎麼辦呢? 我們肯定要有這個指針,才能去實作自定義的過度,例如一點一點的消失啊,翻一頁書那樣的效果等等.

出于我們的目的,我們隻有自己alloc一個UIImageView了,其加載的圖檔就是我們啟動插畫的圖檔.

但是要保證一點:啟動插畫展示的是什麼樣子,我們自己alloc 的UIImageView也應該是什麼樣子, 不然,這個體驗就大打折扣了 你說呢?

而這個UIImageView我們到底應該addSubview在哪裡是本執行個體的一個技術難點.

那答案是什麼?

是UIWindow!卻不是keyWindow.而是一個需要我們自己alloc的UIWindow!   但是它的windowLevel要比keyWindow高一級!

也就是說,為了讓UIImageView順利的展示出來并保證與啟動插畫的樣子一摸一樣,我們需要有一個UIWindow的容器.代碼如下:

iOS精華執行個體之App啟動插畫的自定義過度

UIWindow是一個很神奇的類,當你alloc出來并把windowLevel設定比keyWindow的level高以後,此時不再需要額外的執行makeKeyAndVisible或者addSubview來讓這個UIWindow顯示出來.

但是這個UIWindow的hidden屬性卻預設是YES, 是以我們需要将hidden設定為NO! 讓UIWindow真正顯示出來.

那麼接下來把我們的UIImageView調用addSubview到這個UIWindow上面.

而alloc UIImageView時 有一點我們需要注意一下:

不要通過imageNamed的方式去獲得UIImage, 大家都應該知道imageNamed是會自動把加載過的圖檔資源緩存起來,如果下次再調用同名稱的圖檔,是直接從記憶體中獲得,而我們的這個UIImageView隻使用一次,當插畫隐藏以後不再需要重複使用. 

iOS精華執行個體之App啟動插畫的自定義過度

那正确的擷取方式是什麼?

以絕對路徑的方式獲得這張圖檔資源,就像下面這樣:

iOS精華執行個體之App啟動插畫的自定義過度

imageWithContentsOfFile是符合我們現在使用圖檔資源的需求,因為它在使用完成以後會自動清理掉(ARC)

到此,我們的僞裝版啟動插圖已經部署完成.

何時調用呢?

在第一個啟動的ViewController中的viewWillAppear執行這些代碼.那麼不出意外的話,啟動插畫永遠的顯示了出來.

但是我們不是要一直顯示啊,差不多它就應該消失了,隻是說消失的時候更加友好一些!

因為我們已經有了UIImageView的指針了,接下來我們可以随意控制這個UIImageView消失的方式.

也就達到了本文的目的:

App啟動插畫的自定義過度

而部落客我對于這項執行個體功能封裝了一個類來友善調用! 已經上傳到Github上. 歡迎大家使用并回報問題.

SYAppStart的API很簡單,

提供一套預設的顯示和隐藏方法

核心在于hideWithCustomBlock來自定義更多隐藏插畫的方式.

希望有人能夠pull request 很棒的自定義隐藏代碼!

小技巧:

1.如何全屏展示啟動插畫(隐藏狀态欄那種)?

iOS精華執行個體之App啟動插畫的自定義過度

勾上即可!

2.如何在展示完成以後又立刻恢複狀态欄的顯示?

iOS精華執行個體之App啟動插畫的自定義過度

總結:

部落客本人已對此功能進行封裝,基本上不需要關心核心功能的實作,那為什麼還要費一大半勁去闡述原理?

因為該功能在于如何利用UIWindow去實作,或者說我們想把頂部狀态欄更好的掌控在手中,那麼了解UIWindow是首當其沖!

閱讀完本文以後有任何疑問,都務必說出來,不想注冊csdn賬号的,可以通過微網誌私信我,這是我持續改進文章内容的主要方式. 謝謝!

繼續閱讀