1.UIView和CALayer
- 1.1 在iOS中看的見,摸得著的都是UIView,例如一個按鈕,UITextField则果,UILable等等,都是UIView
- 1.2 UIView之所以能夠顯示在屏幕上漩氨,是試音UIView中有一個圖層
- 1.3 在創(chuàng)建UIView的時候西壮,系統(tǒng)會自動創(chuàng)建一個CALayer在其中,用于顯示東西叫惊,可以通過view.layer來去獲取圖層屬性
- 1.4 當(dāng)UIView要去顯示的時候款青,先去調(diào)用
drawRect
方法,將要繪制的東西繪制到圖層上赋访,然后拷貝圖層可都,完成了UIView的顯示 - 1.5 UIView只有交互的功能,沒有顯示的功能
- 1.6 CALayer只要顯示的功能蚓耽,沒有交互的功能
- 1.7 UIView可以做一些簡單的動畫,例如:平移旋炒,拉伸步悠,旋轉(zhuǎn)
- 1.8 一些比較高端的動畫,都是直接操作CALayer的瘫镇,可以制作3D動畫
- 1.9 使用CALayer鼎兽,可以直接操作顯示的東西,例如陰影铣除,圓角谚咬,邊框等
一.CALayer的簡單使用
1.1 對UIView的CALayer進(jìn)行操作
//添加邊框尚粘,默認(rèn)是黑色
redView.layer.borderWidth = 10
- 設(shè)置綠色邊框和圓角
//設(shè)置邊框
redView.layer.borderWidth = 10
//設(shè)置邊框顏色
redView.layer.borderColor = UIColor.greenColor().CGColor
//設(shè)置圓角
redView.layer.cornerRadius = 30
注意择卦,UIView可以直接設(shè)置圓角,呈現(xiàn)出的是切割后的樣子郎嫁,UIImageView是不行的秉继,還需要添加
masksToBounce = YES
屬性才可以切割!
- 設(shè)置陰影
//設(shè)置邊框
redView.layer.borderWidth = 10
//設(shè)置邊框顏色
redView.layer.borderColor = UIColor.greenColor().CGColor
//設(shè)置圓角
redView.layer.cornerRadius = 30
//陰影顏色
redView.layer.shadowColor = UIColor.orangeColor().CGColor
//陰影偏移
redView.layer.shadowOffset = CGSizeMake(20, 50)
//陰影的不透明度
redView.layer.shadowOpacity = 0.4
二.對UIImageView的操作
- 其實(shí)UIImageView和UIView的CALayer的操作都是相同的泽铛,唯一不同的是圓角
//圓角
picView.layer.cornerRadius = 40
//如果是給UIImageView設(shè)置圓角裁剪尚辑,必須設(shè)置屬性//
// picView.clipsToBounds = true
picView.layer.masksToBounds = true
UIImageView必須調(diào)用picView.clipsToBounds = true(直接對view操作)
或者picView.layer.masksToBounds = true(直接對圖層操作)
否則不會切割。
原因如下:UIImageView中是UIView的主layer上添加了一個次layer盔腔,我們設(shè)置邊框的是主layer杠茬,但是次layer在上變月褥,不會有任何的影響,所以當(dāng)我們調(diào)用切割語句的時候瓢喉,超出邊框意外的都被切割了O偶帷!灯荧!
三.使用CALayer礁击,進(jìn)行三維效果的操作
3.1 注意:
0.都有transform
屬性,但是他們的所屬有區(qū)別逗载,類型也有區(qū)別
1.picView.transform
是二維的屬性哆窿,是CGAffineTransform
類型
2.picView.layer.transform
是layer級別的三維屬性,是CATransform3D
類型的厉斟,當(dāng)然也可以做二維的事情
3.2 過去我們對二維view的做過處理挚躯,如:拉伸,旋轉(zhuǎn)擦秽,平移
//0.使用UIView.transform屬性码荔,CGAffineTransformMakeScale本身是二維的
picView.transform = CGAffineTransformMakeScale(0, 2)
picView.transform = CGAffineTransformMakeRotation(12)
picView.transform = CGAffineTransformMakeTranslation(18, 66)
3.3 我們可以設(shè)置layer的三維屬性
- 科普一下基本的三維空間
- 如果是(4缩搅,3,0)本身是個矢量触幼,所以看看這個矢量是如何的定位的硼瓣?
x軸是4,y軸是3置谦,z軸是0堂鲤,那么就是在x,y界面上媒峡,(4瘟栖,3)的位置,在這個軸上操作谅阿,旋轉(zhuǎn)半哟,平移,或者是拉伸
- 3.3.1 拉伸(三種寫法)
//1.直接使用基本的三維賦值方法
picView.layer.transform = CATransform3DMakeScale(1, 2.5, 0)
//2.使用KVC將CATransform3DMakeScale生成的對象給layer
let trans = CATransform3DMakeScale(5, 1, 0)
let value = NSValue.init(CATransform3D: trans)
picView.layer.setValue(value, forKey: "transform")
//3.使用快捷方法設(shè)置屬性,旋轉(zhuǎn)90°
picView.layer.setValue(5, forKeyPath: "transform.scale.y")
解釋:
1.x軸不變(1就1倍镜沽,就是不變,如果是0贱田,就直接是0倍缅茉,沒有數(shù)據(jù)),y軸變成2.5倍男摧,z軸不管
2.x軸變成5被蔬墩,y軸不變译打,z軸不管
3.讓y軸變成5倍(這個比較常用,在制作動畫的時候拇颅,經(jīng)常用到)
- 3.3.2 平移(三種寫法)
//方法1.直接使用三維屬性賦值
picView.layer.transform = CATransform3DMakeTranslation(110, 403, 180);
//方法2.使用KVC將三維對象賦值
let trans = CATransform3DMakeTranslation(10, 10, 0)
let value = NSValue.init(CATransform3D: trans)
picView.layer.setValue(value, forKeyPath: "transform")
//3.直接給某個屬性通過KVC設(shè)置他具體的值
picView.layer.setValue(100, forKeyPath: "transform.translation.x")
不解釋了哈樟插,自己補(bǔ)腦韵洋,我看評論
- 3.3.3 旋轉(zhuǎn)(三種寫法)
//方法1.基本的旋轉(zhuǎn)
picView.layer.transform = CATransform3DMakeRotation(13, 43, 34, 23)
//方法2.將CATransform3D包裝成對象,傳遞
let trans = CATransform3DMakeRotation(13, 43, 34, 23)
let value = NSValue.init(CATransform3D: trans)
picView.layer.setValue(value, forKeyPath: "transform")
//方法3.平面旋轉(zhuǎn)45°
picView.layer.setValue(M_PI_4, forKeyPath: "transform.rotation")