曾經(jīng)在有道筆記中記載了大量的學(xué)習(xí)心得筆記,偶然發(fā)現(xiàn)周圍好多在簡書使用的,因此從今以后,我也加入簡書這個(gè)大家庭,將有道筆記中心得分享給大家。清零心態(tài),與大家共同成長。歡迎大家點(diǎn)評,我叫小馬哥!哈哈
前言
1:(圓角、陰影、邊框、3D形變)
知識點(diǎn):CALayer1-簡介 - M了個(gè)J - 博客園
哪些需要引入Quartzcore.framework,并#importCALayer、Core Animation、圖形上下文
2.Core Animation是跨平臺的(iOS和MAC OS X),也就是說Core Animation可以用于iPhone和MAC臺式機(jī)的開發(fā),像UIKit框架就不能用于MAC臺式機(jī)的開發(fā)
(UIKit框架只能應(yīng)用在iOS而不能用于Mac,但是Quartz 2D是可以跨平臺的,因此在使用顏色時(shí),不能直接使用UIColor而需要將顏色轉(zhuǎn)成CGColor)
上下文中是這樣設(shè)置顏色的([[UIColor redColor]set];)
3.每一個(gè)UIView都有一個(gè)Layer屬性
4.CALayer可以做圓角、陰影、邊框、3D形變(包括平移、縮放、旋轉(zhuǎn))
5.3D形變屬性既可以用形變函數(shù)指定,也可以用keyPath指定。區(qū)別在于,形變函數(shù)不能疊加,keyPath可以疊加。
舉例:先平移、再縮放、再旋轉(zhuǎn)。用形變函數(shù)的效果是只進(jìn)行了旋轉(zhuǎn)。用keyPath可以使得平移、縮放、旋轉(zhuǎn)同時(shí)疊加了。
6.UIView通過CALayer可以使得圓角、陰影、邊框、3D形變疊加。
但是UIImageView通過CALayer,圓角和陰影不可同時(shí)運(yùn)用。
?UIImageView中不僅一個(gè)子圖層,因此設(shè)置圓角時(shí)需要使用setMasksToBounds:YES,讓所有子圖層跟隨邊框,不過設(shè)置該屬性后,無法使用陰影效果?解決辦法:可以在底層附加一個(gè)UIView實(shí)現(xiàn)陰影效果
7.關(guān)于圓角的說明
若圓角半徑等于視圖的一半時(shí),那么視圖就變成了一個(gè)圓
8.關(guān)于形變中的旋轉(zhuǎn)(x,y,z):一般設(shè)Z為1,其實(shí)設(shè)多大都沒實(shí)際意義。不用設(shè)置x,y
案例1:
1.UIVIew的layer
- (void)myViewLayerDemo
{
? ? ? // ?自定義UIView的圖層屬性
?? ? ?UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
? ? ? [myView setBackgroundColor:[UIColor redColor]];
? ? ? ?[self.view addSubview:myView];
? ? ? ?1) 圓角半徑
? ? ? ? myView.layer.cornerRadius = 50.0f;
? ? ? ? 2) 陰影
? ? ? ? // 因?yàn)镃ore Animation是跨平臺的,基于QuartzCore框架,是因?yàn)閁IKit框架,僅能適用于iOS平臺
? ? ? ? // 在Core Animation中不能使用任何跟UI有關(guān)的方法
? ? ? ? // 要設(shè)置陰影除了顏色之外,還需要指定其他偏移量和透明度參數(shù)
? ? ? ? ? ? ?1> 陰影顏色
? ? ? ? ? ? ? [myView.layer setShadowColor:[UIColor lightGrayColor].CGColor];
? ? ? ? ? ? ? 2> 陰影偏移量
? ? ? ? ? ? ?[myView.layer setShadowOffset:CGSizeMake(0, 10)];
? ? ? ? ? ? ?3> 陰影的透明度
? ? ? ? ? ? ?[myView.layer setShadowOpacity:1.0f];
? ? ? ? 3) 邊框
? ? ? ? [myView.layer setBorderColor:[UIColor whiteColor].CGColor];
? ? ? ? [myView.layer setBorderWidth:3.0f];
}
2.UIImageView的layer (這個(gè)特殊,圓角和陰影不能同時(shí)存在 Label圓角也是需要設(shè)定這個(gè))
- (void)myImageLayerDemo
{
? ? ? ? ?UIImage *image = [UIImage imageNamed:@"頭像1.png"];
? ? ? ? ?UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
? ? ? ? ?[imageView setFrame:CGRectMake(50, 50, 200, 200)];
? ? ? ? ?[self.view addSubview:imageView];
? ? ? ? ?// 1. 圓角半徑(UIImageView和UILabel都需要)
? ? ? ? ?// 提示,在imageView中,圖層不止一個(gè),如果要實(shí)現(xiàn)圓角效果,需要設(shè)置一個(gè)遮罩屬性
? ? ? ? ?// masksToBounds屬性可以讓imageView中的所有子圖層跟隨imageView一起變化
? ? ? ? ? imageView.layer.cornerRadius = 50.0f;
? ? ? ? ? [imageView.layer setMasksToBounds:YES];
// 2. 陰影
// 提示,如果設(shè)置了masksToBounds屬性,imageView的陰影效果無效
[imageView.layer setShadowColor:[UIColor redColor].CGColor];
[imageView.layer setShadowOffset:CGSizeMake(10.0, 10.0)];
[imageView.layer setShadowOpacity:1.0];
// 3. 邊框
[imageView.layer setBorderColor:[UIColor blueColor].CGColor];
[imageView.layer setBorderWidth:3.0f];
// 4. 形變屬性,在CALayer中的形變屬性是3D的,不再是2D的
// 提示,形變參數(shù)使用set方法時(shí),只能應(yīng)用一種形變
// 1> 平移屬性(向上移動100個(gè)點(diǎn))
//? ? [imageView.layer setTransform:CATransform3DMakeTranslation(0, -100, 0)];
//? ? // 2> 縮放屬性
//? ? [imageView.layer setTransform:CATransform3DMakeScale(0.5, 1.0, 1.0)];
//? ? // 3> 旋轉(zhuǎn)屬性
//? ? // 提示:通常在旋轉(zhuǎn)時(shí)指定z軸即可,要延哪個(gè)軸旋轉(zhuǎn),指定一個(gè)數(shù)值1.0即可
//? ? // 圖像本身沒有厚度,如果按照x或y旋轉(zhuǎn)90度,圖像是不可見的。
//? ? [imageView.layer setTransform:CATransform3DMakeRotation(M_PI_2, 0, 0, 1.0)];
// 5. 利用keyPath設(shè)置形變,可以組合使用,但是記住不要輸錯(cuò)
// 提示,在文檔中輸入transform3D可以找到對應(yīng)的transform keyPath
// 1)平移
[imageView.layer setValue:@-100 forKeyPath:@"transform.translation.y"];
// 2) 縮放
[imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];
// 3) 旋轉(zhuǎn)
[imageView.layer setValue:@M_PI_2 forKeyPath:@"transform.rotation.z"];
}