iOS中Layer的zPosition屬性使用

zPosition屬性

其實用到zPosition並不是因爲學習CALayer,而是在很久的以前,使用[view bringSubviewToFront:view1];的時候,當時不知道是什麼原因,一直起不了作用,最後大神告訴我。可以爾爾 view1.layer.zPosition = 1;就簡單搞定了。因爲layer其實是三維空間的,而不是簡單的二維。而z軸的position初始值都是0.z軸的值越大,在圖層的越上方......自行腦補吧......

 

 

 

 

CALayer是什麼

CALayer(層)是屏幕上的一個矩形區域,在每一個UIView中都包含一個CALayer,CALayer負責UIView的視圖顯示。

Layer與UIView的關係

根據CALayer的定義,我們不難發現CALayer與UIView是一個包含關係,但是其中又不完全是包含關係。

以我個人的理解,大概可以這樣描述。

UIView是對CALayer以及Response的一些封裝,使得它具有除了視圖顯示之外的其他屬性。比如它的子類UIButton具有點擊操作,UIView本身有GestureRecognizer的一些操作。至於CALayer暴露給UIView的部分我們都可以用UIView來實現,比如說Frame

如下面的例子所示:使用view的layer屬性,可以對view的frame進行更改。

當我們使用view.layer修改他的frame的時候,是這樣的

事實上,我們對UIView的frame進行操作的時候,最終也是傳輸給layer進行具體操作的。也許你會覺得我們僅僅是修改了他的Layer的Frame,並UIView依舊是剛纔那個CGRectMake(100,100,100,100);的frame。但是接下來我們給他加一個觸摸事件看一下,我點擊的部分我可以十份肯定不在CGRectMake(100,100,100,100)的區域,而在CGRectMake(100,100,200,200);的。但是它依然響應了觸摸事件,我們知道CALayer是不能響應事件的,所以我們可以完全肯定,通過layer修改了view的frame。從而可以證明之前的包含和暴露結論

CALayer可以做什麼

屢清楚了CALayer是什麼之後,我們更迫切的想知道,它到底能做什麼。

好吧,其實這個時候打開CALayer的.h文件比較靠譜,看看他都有哪些屬性是UIView沒有的,那就是沒有暴露給UIView的,只有通過它自己纔可以實現的。比如說這些

如果比較追求細節和技術的童鞋,就一條條的屢過去吧,總是會有收穫的。

在github上的一份翻譯上,我找到了對CALayer沒有暴露給UIView的功能總結;

1,陰影,圓角,帶顏色的邊框

2,3D變換

3,非矩形範圍

4,多級非線性動畫。

好吧,接下來主要說一下我認爲比較實用的一些屬性。

cornerRadius

position

contents

borderWidth/borderColor

maskToBounds

contentRect

官方給的解釋是這樣的

/* A rectangle in normalized image coordinates defining the


 * subrectangle of the `contents' property that will be drawn into the

 * layer. If pixels outside the unit rectangles are requested, the edge

 * pixels of the contents image will be extended outwards. If an empty

 * rectangle is provided, the results are undefined. Defaults to the

 * unit rectangle [0 0 1 1]. Animatable. */

大概意思就是說在layer中,我們可以通過這個屬性,來顯示它的局部內容。它的默認的大小是[0011],也就是顯示全部。乍一看好像也沒有太大的用處。但是這讓我想起了剛學編碼的時候一個盛大的大神給我曬的他們的UI圖。大概是這個樣子的,當然上面還有標註座標,只是原圖我已經找不到了。

運用這個屬性,我們可以將APP需要載入的一些icon進行拼合,然後在顯示的時候運用contentsRect進行切圖,因爲單張大圖的載入速度,會比n張小圖載入的速度快。(至於爲什麼,好吧我也不大懂,不過我想,n張小圖就要做n次請求,而1張大圖只要做一次請求,貌似是有那麼點道理,就讓我自己強行腦補一波吧)

至於使用,那就是非常簡單了,只需要view.layer.contentsRect(0,0,0.5,0.5);類似這樣,從左上角到右下角,0-1的一個座標系。(0,0,1,1)就表示整張圖都顯示了。

anchorPoint

什麼事anchorPoint?好吧,它就是一顆圖釘,按住layer,讓layer圍着它轉。這裏需要說一點的是,這可圖釘直接影響着view的位置。所以一般來說,都是先設置anchorePoint之後再設置frame.從而可以簡單的讓它不變形。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章