UIView三個重要的布局屬性:frame,bounds,center
CAlayer與之對應的屬性:frame,bounds,position
- frame代表圖層的外部坐標(相對于自己的父圖層)
- bounds是內部坐標({0,0}通常是圖層的左上角)
- center和position都代表了相對于父圖層anchorPoint所在的位置
視圖的frame,bounds和center屬性僅僅是存取方法,當操作視圖的frame,實際上是改變位于視圖下方CALayer的frame,不能夠獨立于圖層之外改變視圖的frame
視圖或者圖層的frame是根據bounds,position和transform計算而來
錨點(anchorPoint)
anchorPoint是CGPoint的屬性,是圖層的相對坐標默認坐標是(0.5,0.5)
改變anchorPoint的效果
坐標系
使用過UIView的相對坐標變換的方法,你就很容易理解與其對應的CALayer在不同圖層的坐標系中相互轉換的方法,這些方法可以把定義在一個圖層坐標系下的點或者矩形轉換成另一個圖層坐標系下的點或者矩形.
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
翻轉的幾何結構(geometryFlipped)
在iOS中,圖層的布局坐標系的原點是在圖層的左上角。在iOS上通過設置geometryFlipped為YES,以為這它的子圖層將會被垂直翻轉,也就是將會沿著底部排版而不是通常的頂部
如果父視圖使用了翻轉變換,它的子視圖內容(以及它對應的圖層)將會被顛倒,設置子圖層的geometryFlipped屬性為YES可以修正。不推薦使用
Z坐標軸(zPosition和anchorPointZ)
CALayer存在于一個三維空間中,zPositon和anchorPointZ都是在Z軸上描述圖層位置的浮點類型。zPosition最實用的功能是改變圖層的顯示順序。
以我們的視角來看,zPosition越大就越靠近我們,就顯示在上層
Hit Testing
CALayer不關心任何響應鏈事件,但是我們可以通過:-containsPoint:和-hitTest:
- containsPoint接收一個在圖層坐標系下的CGPoint,如果點在圖層的frame范圍內則返回YES
- hitTest接收CGPoint,但是返回的不是BOOL類型而是返回點擊的圖層本身
- hitTest返回的圖層是按照圖層樹中的圖層順序,如果改變了zPosition從而改變了屏幕上圖層顯示的順序,則返回的圖層可能是被遮擋的其他圖層
conrnerRadius
conrnerRadius設置圖層角的曲率和maskToBounds配合使用
borderWidth和borderColor
borderWidth是繪制在圖層邊界里邊的,而且在所有子視圖之前,默認0
borderColor默認黑色
陰影
- shadowColor :陰影的顏色
- shadowOpacity:0-1之間的浮點數,可以理解為陰影的透明度
- shadowOffset:CGSize類型,寬度控制陰影橫向的位移,高度控制縱向的位移,默認值為(0,-3),意味著相對于Y軸向上位移三個點(為什么要默認向上的陰影呢?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創建的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了默認的3個點位移的陰影是向上的。在Mac上, shadowOffset 的默認值是陰影向下的,這樣你就能理解為什么iOS上的陰影方向是向上的了)
- shadowRadius:控制陰影的模糊度,數值越大,邊界線看上去就會更加的模糊和自然
- shadowPath:CGPathRef類型(一個指向CGPaht的指針),可以通過這個屬性單獨于圖層形狀之外指定陰影的形狀
----注----
- 圖層的陰影繼承自內容的外形
- 陰影通常在Layer之外,如果開啟maskToBounds屬性,則會將陰影剪切掉,如果想要得到效果,單獨創建一個繪制陰影的外圖層
- 如果事先知道了陰影的形狀,可以使用shadowPath來提高性能
mask
mask:CALayer類型,定義父圖層的部分可見區域,CALayer蒙板圖層真正厲害的地方在于蒙板圖不局限于靜態圖,任何有圖層構成的都可以作為mask屬性,這意味著你的蒙版可以通過代碼甚至是動畫實時生成
minificationFilter和magnificationFilter
設置layer的contents數據縮放拉伸時的描繪方式,minificationFilter用于縮小,magnificationFilter用于放大
- kCAFilterLinear:默認值,縮放平滑,但容易產生模糊效果
- kCAFilterTrilinear:基本和kCAFilterLinear相同
- kCAFilterNearest:速度快不會產生模糊,但會降低質量并像素化圖像
#######線性過濾保留了形狀,最近過濾則保留了像素的差異
opacity
UIView通過alpha屬性確定視圖的透明度,CALayer有一個等同的屬性opacity。兩個屬性都將影響子層級的透明度。
如果你設置了圖層的透明度,你希望它包含的整個圖層樹想一個整體一樣透明,你可以通過下列方法達到效果:
1.設置Info.plist文件中的UIViewGroupOpacity為YES,缺點是會影響到整個應用
2.設置CALayer的一個shouldRasterize屬性,如果它被設置為YES,在應用透明度更改之前,圖層及其子圖層會被整合成一張整體的圖片,為了啟用shouldRasterize屬性,我們設置了圖層的rasterizationScale**屬性,默認情況下是1,使用shouldRasterize時需要設置,防止出現Retina屏幕像素化的問題(shouldRasterize可以緩存圖層內容,可以優化性能)