UIView與CALayer的區別

2022-03-27 14:33:05 字數 2194 閱讀 1140

研 究core animation已經有段時間了,關於core animation,網上沒什麼好的介紹。蘋果**上有篇專門的總結性介紹,但是似乎原理性的東西不多,看得人雲山霧罩,感覺,寫那篇東西的人,其實是假 設讀的人了解介面動畫技術的原理的。今天有點別的事情要使用linux,忘掉了ssh的密碼,沒辦法重新設ssh,結果怎麼也想不起來怎麼設ssh遠端登 陸了,沒辦法又到網上查了一遍,太浪費時間了,痛感忘記記筆記是多麼可怕的事情。鑑於core animation的內容實在是非常繁雜,應用的obj-c語言本身的特性也很多,所以寫個備忘錄記錄一下,懂的人看了後如果發現了錯誤,還不吝指教。

1.uiview是ios系統中介面元素的基礎,所有的介面元素都繼承自它。它本身完全是由coreanimation來實現的(mac下似乎不是這

樣)。它真正的繪圖部分,是由乙個叫calayer(core animation

layer)的類來管理。uiview本身,更像是乙個calayer的管理器,訪問它的跟繪圖和跟座標有關的屬性,例如frame,bounds等等,

實際上內部都是在訪問它所包含的calayer的相關屬性。

2.uiview有個layer屬性,可以返回它的主calayer例項,uiview有乙個layerclass方法,返回主layer所使用的類,uiview的子類,可以通過過載這個方法,來讓uiview使用不同的calayer來顯示,例如通過

1- (class) layerclass

使某個uiview的子類使用gl來進行繪製。

3.uiview的calayer類似uiview的子view樹形結構,也可以向它的layer上新增子layer,來完成某些特殊的表示。例如下面的**

1graycover = [[calayer alloc] init];

2graycover.backgroundcolor = [[[uicolor blackcolor] colorwithalphacomponent:0.2] cgcolor];

3[self.layer addsublayer: graycover];

會在目標view上敷上一層黑色的透明薄膜。

4.uiview的layer樹形在系統內部,被系統維護著三份copy(這段理解有點吃不準)。

第乙份,邏輯樹,就是**裡可以操縱的,例如更改layer的屬性等等就在這乙份。

第二份,動畫樹,這是乙個中間層,系統正在這一層上更改屬性,進行各種渲染操作。

第三份,顯示樹,這棵樹的內容是當前正被顯示在螢幕上的內容。

這三棵樹的邏輯結構都是一樣的,區別只有各自的屬性。

5.動畫的運作

uiview的主layer以外(我覺得是這樣),對它的sublayer,也就是子layer的屬性進行更改,系統將自動進行動畫生成,動畫持續時間有

個預設時間,個人感覺大概是0.5秒。在動畫時間裡,系統自動判定哪些屬性更改了,自動對更改的屬性進行動畫插值,生成中間幀然後連續顯示產生動畫效果。

6.座標系系統(對position和anchorpoint的關係還是犯暈)

calayer的座標系系統和uiview有點不一樣,它多了乙個叫anchorpoint的屬性,它使用cgpoint結構,但是值域是0~1,也就是

按照比例來設定。這個點是各種圖形變換的座標原點,同時會更改layer的position的位置,它的預設值是,也就是在layer的**。

某layer.anchorpoint = cgpointmake(0.f, 0.f);

如果這麼設定,layer的左上角就會被挪到原來的中間的位置,

加上這樣一句就好了

某layer.position = cgpointmake(0.f, 0.f);

7.真實例子的分析

這是iphone上ibook翻頁的效果,假設每一頁都是乙個uiview,我覺得乙個頁面是貼了倆個layer,文字layer顯示正面的內容,背面

layer用文字layer的快照做affine翻轉,貼在文字layer的後面。因為layer可以設定顯示陰影,也許後面的陰影效果沒有使用單獨的一

個layer來顯示。至於這個曲面效果,我查了很多資料也沒有結果,估計是使用了gl的曲面繪圖?

8.最後乙個讓人噁心的。

layer可以設定圓角顯示,例如uibutton的效果,也可以設定陰影顯示,但是如果layer樹中的某個layer設定了圓角,樹中所有layer

的陰影效果都將顯示不了了。如果既想有圓角又想要陰影,好像只能做兩個重疊的uiview,乙個的layer顯示圓角,乙個的layer顯示陰

影.....

UIView與CALayer的理解

1 初始化乙個calayer calayer是含隱式動畫的 layer calayer alloc init 設定calayer的顏色 layer.backgroundcolor uicolor orangecolor cgcolor layer.frame cgrectmake 0,0,100,1...

UIView與CALayer的選擇

layer.contents id uiimage iamgewithnamed cgimage 如何選擇 關於calayer的疑惑 calayer是定義在quartzcore框架中的 cgimageref cgcolorref兩種資料型別是定義在coregraphics框架中的 uicolor u...

CALayer與UIView 的區別

的區別 href target blank rel noopener calayer與uiview 的區別 2407279660 舉報trackback 1.uiview是ios系統中介面元素的基礎,所有的介面元素都繼承自它。它本身完全是由coreanimation來實現的 mac下似乎不是 這樣 ...