通過幾回實驗,發現若是分享的文章能構成系列,效果會很是好。同時本身也能收穫很大,可以整塊整塊的複習,也可以幫助本身更深刻的塊狀學習知識。對本身梳理線條,整理知識體系做用很是大。ios
因此此次仍是打算用這種方式,一塊兒來分享一下iOS中關於動畫的部分。iOS 的動畫渲染簡直是帥的不要不要的,哈哈。其實當初就是由於iOS的動畫,還有iOS的對手勢的處理深深的打動了我,才讓我這樣一個高齡中年老男人開始了iOS這條路。啦啦啦啦~bash
開始我們的第一篇內容。函數
實現的效果。不當心暴露了寫文章的時間。-_-+++
學習
實現的步驟思惟導圖:
動畫
其實今天分享的主角是CALayer。由於全部的動畫都是在CALayer上完成的。ui
@property(nonatomic,readonly,retain) CALayer *layer;
屬性類型 | 屬性名稱 | 用途 |
---|---|---|
@property CGFloat | borderWidth; | 邊寬 |
@property CGColorRef | borderColor; | 邊的顏色 |
@property CGColorRef | backgroundColor; | 背景顏色 |
@property float | opacity; | 透明度 |
@property CGColorRef | shadowColor; | 陰影顏色 |
@property float | shadowOpacity; | 陰影透明度,設置範圍0~1。 |
@property CGSize | shadowOffset; | 陰影的偏移 |
@property CGFloat | shadowRadius; | 陰影的模糊度 |
@property(strong) id | contents; | 內容。能夠設置爲圖片,可是須要橋接。 |
@property CGFloat | cornerRadius; | 圓角 |
@property CGRect | bounds; | Layer的大小 |
@property CGPoint | position; | 默認狀況下至關於UIView的center |
@property CGPoint | anchorPoint; | position的錨點 |
@property CATransform3D | transform; | 用來作形變的,是一個矩陣。能夠理解爲結構體。 |
@property BOOL | masksToBounds; | 超過部分進行裁剪 |
masksToBounds
。由於超過部分會被裁減。UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:imageView];
// 設置背景顏色。注意UIColor 和 CGColor之間的互換
imageView.layer.backgroundColor = [UIColor grayColor].CGColor;
// 生成一個path
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(-10, -10, imageView.bounds.size.width + 20, imageView.bounds.size.height + 20)];
// 設置陰影path
imageView.layer.shadowPath = path.CGPath;
// 設置陰影顏色
imageView.layer.shadowColor = [UIColor lightGrayColor].CGColor;
// 設置陰影透明度
imageView.layer.shadowOpacity = 0.5;複製代碼
CALayer *layer = [[CALayer alloc] init];
// ------------------- 設置位置大小 ---------------------
// 方式一: 直接設置 frame
// layer.frame = CGRectMake(50, 50, 200, 200);
// 方式二:
// 先設置大小
layer.bounds = CGRectMake(0, 0, 100, 100);
// 再設置位置(默認狀況下 position 指的是 center。)
layer.position = CGPointMake(150, 150);
// ------------------- 設置位置大小 ---------------------
layer.backgroundColor = [UIColor redColor].CGColor;
layer.opacity = 0.7;
[self.view.layer addSublayer:layer];
}複製代碼
從這裏開始,我們的座標軸就變成了xyz三個軸向了,由於圖案也會變成立體的了。atom
self.myLayer.transform = CATransform3DMakeRotation(M_PI_4, 10, 20, 30);複製代碼
這段代碼的意思就是說從{0,0,0}這個點,到{10,20,30}這個點,劃一根線。圖形繞着這根線,旋轉M_PI_4度數。spa
在真實世界中,當物體遠離咱們的時候,因爲視角的緣由看起來會變小,理論上說遠離咱們的視圖的邊要比靠近視角的邊跟短,但實際上並無發生,而咱們當前的視角是等距離的,也就是在3D變換中任然保持平行,和以前提到的仿射變換相似。code
「爲了作一些修正,咱們須要引入投影變換(又稱做z變換)來對除了旋轉以外的變換矩陣作一些修改,Core Animation並無給咱們提供設置透視變換的函數,所以咱們須要手動修改矩陣值,幸運的是,很簡單:
CATransform3D
的透視效果經過一個矩陣中一個很簡單的元素來控制:m34。m34用於按比例縮放X和Y的值來計算到底要離視角多遠。」orm
Excerpt From: 鐘聲. 「ios核心動畫高級技巧.」 iBooks.
d
來應用透視效果d
表明了想象中視角相機和屏幕之間的距離,以像素爲單位,那應該如何計算這個距離呢?實際上並不須要,大概估算一個就行了。」Excerpt From: 鐘聲. 「ios核心動畫高級技巧.」 iBooks.
struct CATransform3D{
CGFloat m11(x縮放), m12(y切變), m13(旋轉), m14();
CGFloat m21(x切變), m22(y縮放), m23, m24;
CGFloat m31(旋轉), m32, m33, m34(透視效果,要有旋轉角度才能看出效果);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44;
};
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};複製代碼
// 定義矩陣
CATransform3D transform = CATransform3DIdentity;
transform.m34 = -1.0 / 800;
// 旋轉加透視
transform = CATransform3DRotate(transform, -M_PI_4, 0, 1, 0);
imageView.layer.transform = transform;複製代碼
//方式一:
transform = CATransform3DMakeScale(<#CGFloat sx#>, <#CGFloat sy#>, <#CGFloat sz#>)
//方式二:
transform = CATransform3DScale(imageView.layer.transform, <#CGFloat sx#>, <#CGFloat sy#>, <#CGFloat sz#>)複製代碼
//開啓
[CATransaction begin];
//關閉動畫
[CATransaction setDisableActions:YES];
//修改屬性
self.myview.layer.position = CGPointMake(10, 10);
//提交
[CATransaction commit];複製代碼
寶貝兒們,我錯了。寫到這裏發現已經辣麼長辣麼長了,再寫下去這篇該沒有人看了。
那麼,那麼。。。。就臨時變卦吧,把這篇文章變成上下集吧。哈哈~就這麼愉快的本身打本身的臉了~
因此,證實一個道理。計劃都只是用來計劃的,樹立一個目標,能不能實現再說。哈哈~