iOS核心動畫(三)

視覺效果

圓角

CALayer有一個叫做conenerRadius的屬性控制著圖層角的曲率芒帕。float類型伦吠,默認為0.并且吧masksToBounds設置成為YES的話根暑,圖層里面的所有東西都會被截取毒涧,呈現(xiàn)出圓角狀態(tài)贮预。

邊框

CALayer中的borderWidth和borderColor,兩者共同定義了圖層邊的繪制樣式。這條線沿著圖層的bouds繪制仿吞,同時也包含圖層的角滑频。
borderWidth為float類型,默認為0唤冈,
borderColor為CGColorRef類型峡迷,默認黑色。

陰影

CALayer中的shadowOpacity屬性控制著陰影你虹,float類型绘搞,默認為0,
shadowColor控制著陰影的顏色傅物,CGColorRef類型夯辖,默認黑色,
shadowOffset控制著陰影的方向和距離董饰,CGSize的值楼雹,寬度控制這陰影橫向的位移,高度控制著縱向的位移尖阔,默認值{0,-3}榨咐,即陰影相對于Y軸有3個點的向上位移介却,
shadowRadius控制著陰影的模糊度,float類型块茁,默認為0齿坷,
shadowPath控制陰影的形狀,CGPathRef類型(一個指向CGPath的指針)


變換

仿射變換

CGAffineTransform是一個可以和二維空間向量(例如CGPoint)做乘法的3*2的矩陣!
1.png

CGAffineTransform中的“防射”的意思是無論變換矩陣用什么值数焊,圖層中平行的兩條線在變換之后仍然保持平行永淌。
x按照a值得比例縮放,
y按照d值得比例縮放
x按照c值比例拉伸
y按照b值比例拉伸
x跟著tx進行平移
y會跟著ty進行平移

CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) 
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)

UIView可以通過設置transform屬性做變換佩耳,但實際上它只是封裝了內部圖層的變換
CALayer同樣也有一個transform屬性遂蛀,但它的類型是CATransform3D
將一個圖片旋轉45度

  UIImage *image = [UIImage imageNamed:@"111"];
  self.layerView.layer.contents = (__bridge id)image.CGImage;
  CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_4);
  self.layerView.layer.affineTransform = transform;
2.png
混合變換

Core Graphics提供了一系列的函數(shù)可以在一個變換的基礎上做更深層次的變換,

CGAffineTransformRotate(CGAffineTransform t, CGFloat angle) 
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy) 
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
Tranform類型

1干厚、平移

  • 根據(jù)本身的transform進行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
  • 根據(jù)本身的transform后另外的transform進行平移
    CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)

2李滴、縮放

  • 修改本身的transform進行縮放CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
  • 根據(jù)本身的transform后者另外的transform進行縮放CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)

3、反向旋轉
CGAffineTransformInvert(CGAffineTransform t)
4蛮瞄、合并
將兩個transform合并起來CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
5所坯、放射矩陣應用

  • 得到新的中心CGPoint CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)
  • 得到新的size CGSize CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t)
  • 得到新的rect CGRect CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t)
    放射矩陣一個常用的情形就是根據(jù)用戶的收拾來相應的改變試圖的變換。
//縮放50%挂捅,旋轉30度芹助,X軸移動50像素
UIImage *image = [UIImage imageNamed:@"111"];
self.layerView.layer.contents = (__bridge id)image.CGImage;
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, 0.5, 0.5);//縮放50%
transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0);//旋轉30度
transform = CGAffineTransformTranslate(transform, 50, 0);//X軸移動50像素
self.layerView.layer.affineTransform = transform;
3.png
斜切變換

沒有提供直接的函數(shù),需要自己定義


CGAffineTransform CGAffineTransformMakeShear(CGFloat x, CGFloat y) {
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform.c = -x;
    transform.b = y;
    return transform;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage *image = [UIImage imageNamed:@"111"];
    self.layerView.layer.contents = (__bridge id)image.CGImage;
    self.layerView.layer.affineTransform = CGAffineTransformMakeShear(1, 0);
    
}
4.png

3D變換

CATransform3D是一個可以在三維空間內做變換的4*4矩陣


5.png

和CGAffineTransform矩陣類似,Core Animation提供了一系列的方法用來創(chuàng)建和組合CATransform3D類型的矩陣

//angle旋轉的弧度状土,
CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z) 
//sx x軸縮放 sy y軸縮放 sz z軸縮放
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
//tx x平移无蜂, ty y平移 tz z平移 
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)

CATransform3D中的M34元素,用來做透視變換效果(-1.0/d)d表示了想象中視角相機和屏幕之間的距離
sublayerTransform屬性表示父視圖變換声诸,里面的子試圖也隨之變換酱讶。

CAShapeLayer

CAShapeLayer是CALayer的子類,是通過一個矢量圖而不是bitmap來繪制的圖層子類彼乌。具有渲染速度快泻肯、高效實用內存、不會被圖層邊界裁掉慰照、不會出現(xiàn)像素化等優(yōu)點灶挟。

UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(175, 100)];
    
    [path addArcWithCenter:CGPointMake(150, 100) radius:25 startAngle:0 endAngle:2 * M_PI clockwise:YES];
    [path moveToPoint:CGPointMake(150, 125)];
    [path addLineToPoint:CGPointMake(150, 175)];
    [path addLineToPoint:CGPointMake(125, 225)];
    [path moveToPoint:CGPointMake(150, 175)];
    [path addLineToPoint:CGPointMake(175, 225)];
    [path moveToPoint:CGPointMake(100, 150)];
    [path addLineToPoint:CGPointMake(200, 150)];
    
    
    CAShapeLayer *shapLayer = [CAShapeLayer layer];
    shapLayer.strokeColor = [UIColor redColor].CGColor;
    shapLayer.fillColor = [UIColor clearColor].CGColor;
    shapLayer.lineWidth = 5;
    shapLayer.lineJoin = kCALineJoinRound;
    shapLayer.lineCap = kCALineCapRound;
    shapLayer.path = path.CGPath;
    [self.view.layer addSublayer:shapLayer];
6.png
CAShapeLayer屬性 內容
CGPathRef path 繪圖路徑
CGColorRef fillColor 閉合路徑填充顏色
NSString *fillRule 填充規(guī)則
CGColorRef strokeColor 路徑顏色
CGFloat lineWidth 線條寬度
CGFloat miterLimit 最大斜接長度
NSString *lineCap 線端點類型
NSString *lineJoin 線連接類型
CGFloat lineDashPhase 線性模板的起始位置
NSArray<NSNumber *> *lineDashPattern 索引從1開始記,奇數(shù)位數(shù)值表示實線長度毒租,偶數(shù)位數(shù)值表示空白長度
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末稚铣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子墅垮,更是在濱河造成了極大的恐慌惕医,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件算色,死亡現(xiàn)場離奇詭異抬伺,居然都是意外死亡,警方通過查閱死者的電腦和手機灾梦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門紧憾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驳概,“玉大人肉康,你說我怎么就攤上這事募强。” “怎么了萧福?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵拉鹃,是天一觀的道長。 經常有香客問我鲫忍,道長毛俏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任饲窿,我火速辦了婚禮煌寇,結果婚禮上,老公的妹妹穿的比我還像新娘逾雄。我一直安慰自己阀溶,他們只是感情好腻脏,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著银锻,像睡著了一般永品。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上击纬,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天鼎姐,我揣著相機與錄音,去河邊找鬼更振。 笑死炕桨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肯腕。 我是一名探鬼主播献宫,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼实撒!你這毒婦竟也來了姊途?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤知态,失蹤者是張志新(化名)和其女友劉穎捷兰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體负敏,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寂殉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了原在。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡彤叉,死狀恐怖庶柿,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情秽浇,我是刑警寧澤浮庐,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站柬焕,受9級特大地震影響审残,放射性物質發(fā)生泄漏。R本人自食惡果不足惜斑举,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一搅轿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧富玷,春花似錦璧坟、人聲如沸既穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幻工。三九已至,卻和暖如春黎茎,著一層夾襖步出監(jiān)牢的瞬間囊颅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工傅瞻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踢代,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓俭正,卻偏偏與公主長得像奸鬓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掸读,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容