從專案說起
說實話,UILayer就像alpha等於0.5一樣,我始終有點不清晰的感覺。這種感覺大概源於其實專案上真正用到UILayer的地方不是特別多,有用到也只是用幾個方法。而那些牛逼的大廠面試好像也看不起這個小小的layer,我們研究它呢就算純粹的格物致知,瞭解事物根本原來。
什麼是UILayer
那麼回到了標題了,UILayer是什麼鬼?答案是根本就沒有UILayer,蘋果官方文件,和我們平時用的其實都是CALayer。同時每個UIView裡面都有一個layer屬性,這就是讓我們誤認為是UILayer的東西。那麼既然分開看就好說了,UIView繼承於UIResponder,它主要管的其實是使用者的反應那方面,CALayer整合於NSObject,蘋果官方文件是這樣解釋的:
An object that manages image-based content and allows you to perform animations on that content.
翻譯過來的意思就是-----管理基於影象的內容的物件,允許您對該內容執行動畫。動畫方面我們此處不表,我們主要研究下管理基於影象的內容的物件。
如何管理基於影象的物件
我們都知道你給一個UIView弄個綠色也就算影象了,那我直接UIView.frame就能更改位置大小了啊,我UIView.backgroundColor就算更改影象顏色啦,和你一個CALayer有一分錢關係沒有?其實UIView只是CALayer的一個代理,你UIView的這些方法其實都只是CALayer的代理方法。啥?你說我扯淡?好,我們看蘋果官方文件上的話:
If the layer object was created by a view, the view typically assigns itself as the layer’s delegate automatically, and you should not change that relationship. For layers you create yourself, you can assign a delegate object and use that object to provide the contents of the layer dynamically and perform other tasks. A layer may also have a layout manager object (assigned to the layoutManager property) to manage the layout of subviews separately.
這段話就不翻譯了,其實翻譯過來就是我上面說的意思,UIView其實沒你想的那麼牛逼,其實它本職工作就是響應響應使用者事件,凡是眼睛看到的東西基本都是封裝在CALayer裡面的,不信你看這些方法hitTest,hidden,mask,其實都是CALayer的方法。這就和我開頭所寫的有了悖論,我們不是平時工作中用不到它,而是用的太頻繁了,但是它太低調導致我們有時候誤認為一切都是UIView的功勞,它才是
事了拂衣去,深藏功與名
那麼就讓我們以後繼續愉快的使用它吧