UIView動畫

一般來說,對于UIView的動畫纯蛾,大概分為UIView的仿射變換纤房,基于CA和它的子類的動畫,以及CG相關(guān)的動畫翻诉。

動畫的形式一般為平移炮姨,縮放,旋轉(zhuǎn)碰煌,翻轉(zhuǎn)舒岸,一種或多種組合。設(shè)置動畫變換常用的屬性.frame.transform芦圾,因此常被稱為

  1. frame動畫
  2. transform動畫

使用這兩種動畫模式蛾派,只需要在apple提供的動畫api中適當(dāng)?shù)奶砑觿赢嫼蟮膄rame和transform,并設(shè)置好動畫時長,即可達到動畫過度的效果洪乍。但是使用frame的局限性很強眯杏,使用平移和縮放還好,旋轉(zhuǎn)則需要使用比較復(fù)雜的矩陣計算公式壳澳,才能得到旋轉(zhuǎn)后的frame岂贩,所以只適合實現(xiàn)最簡單的平移和縮放的動畫。

所以本章主要的還是討論transform動畫

動畫的語法api

動畫的語法常用的有兩種方式

  1. UIView的block方式

     [UIView animateWithDuration:2.0 animations:^{
         view.transform = transform;
     }];
    
  2. UIView的begin-commit方式

    - (void)transformLeftToRightAndScale {
        UIView *view = [self getView];
        CGRect start = CGRectMake(10, 64 + 10 + 2 * (50 + 10), 50, 50);
        view.frame = start;
        [self.view addSubview:view];
        
        CGAffineTransform bigTransform = CGAffineTransformMakeScale(1.2, 1.2);
        
        CGFloat fx = BoundW - CGRectGetWidth(view.frame) - 10 - 10; // 沿著X方向平移
        CGFloat fy = - 2 * (50 + 10); // 沿著Y方向平移
        CGAffineTransform moveTransform = CGAffineTransformMakeTranslation(fx, fy);
        
        CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI);
        
        [UIView beginAnimations:@"move" context:nil];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:2.0];
        
        [view setTransform:CGAffineTransformConcat(rotate, CGAffineTransformConcat(bigTransform, moveTransform))];
        
        [UIView commitAnimations];
    }

仿射變換巷波,仿射變換的兩種類型--二維和三維

仿射變換分為二維的仿射變換和三維的仿射變換河闰,對應(yīng)的api分別為CGAffineTransformCATransform3D.

CGAffineTransform

CGAffineTransform適用于平移褥紫,縮放姜性,旋轉(zhuǎn),在二維空間進行操作髓考。api為animationView.transform = transform部念。來先看一下CGAffineTransform的數(shù)據(jù)結(jié)構(gòu)。

struct CGAffineTransform {
    CGFloat a, b, c, d;
    CGFloat tx, ty;
};

CGAffineTransform使用一個結(jié)構(gòu)體進行封裝氨菇,本質(zhì)上表達的是一個3*3的矩陣儡炼。由于第三列始終是(0,0,1),因此數(shù)據(jù)結(jié)構(gòu)僅包含前兩列的值查蓉。

CGAffineTransform矩陣.png

CGAffineTransform從概念上講乌询,仿射變換將表示圖形中每個點(x,y)的行向量乘以該矩陣豌研,從而生成表示對應(yīng)點(x'妹田,y')的向量:

image.png

給定3乘3矩陣,以下等式用于將一個坐標系中的點(x鹃共,y)變換為另一個坐標系中的合成點(x'鬼佣,y')

image.png

所以當(dāng)兩個仿射進行連接,本質(zhì)上是兩個仿射變換的矩陣乘積

矩陣數(shù)學(xué)計算公式 理解矩陣乘法

矩陣計算公式.png

CGAffineTransform的相關(guān)api

最具體的還是參考 CGAffineTransform文檔

  1. 創(chuàng)建仿射變換矩陣

     CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty); //返回根據(jù)您提供的值構(gòu)造的仿射變換矩陣
    
     CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle); //返回根據(jù)您提供的旋轉(zhuǎn)值構(gòu)造的仿射變換矩陣霜浴。
    
     CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy); //返回由您提供的縮放值構(gòu)造的仿射變換矩陣晶衷。
    
     CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty); //返回根據(jù)您提供的轉(zhuǎn)換值構(gòu)造的仿射變換矩陣
    
  2. 修改仿射變換

    CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty); // 通過修改現(xiàn)有仿射變換而構(gòu)造的仿射變換矩陣。
    
    CGAffineTransformScale // 返回通過縮放現(xiàn)有仿射變換而構(gòu)造的仿射變換矩陣
    
    CGAffineTransformRotate // 返回通過旋轉(zhuǎn)現(xiàn)有仿射變換構(gòu)造的仿射變換矩陣
    
    CGAffineTransformInvert // 返回通過反轉(zhuǎn)現(xiàn)有仿射變換而構(gòu)造的仿射變換矩陣
    
    CGAffineTransformConcat // 返回通過組合兩個現(xiàn)有仿射變換而構(gòu)造的仿射變換矩陣
  1. 應(yīng)用仿射變換

     CGPoint CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t); // 將指定的仿射變換應(yīng)用于現(xiàn)有點所產(chǎn)生的新點
     
     CGSize CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t); // 通過將指定的仿射變換應(yīng)用于現(xiàn)有大小而產(chǎn)生的新大小
     
     CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t); // 變換后的矩形
    

CGAffineTransformConcat

組合兩個已存在的仿射變換阴孟,數(shù)學(xué)本質(zhì)上是兩個矩陣進行乘積晌纫。

CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2);

CATransform3D

CATransform3D變換矩陣用于旋轉(zhuǎn),縮放永丝,平移锹漱,傾斜和投影圖層內(nèi)容,適用于二維和三維空間進行變換类溢。api為animationView.layer.transform = transform凌蔬。來先看一下CATransform3D的數(shù)據(jù)結(jié)構(gòu)。

struct CATransform3D
{
  CGFloat m11, m12, m13, m14;
  CGFloat m21, m22, m23, m24;
  CGFloat m31, m32, m33, m34;
  CGFloat m41, m42, m43, m44;
};

CATransform3D是一4*4的矩陣闯冷,同樣表示一個點的映射關(guān)系 iOS核心動畫:高級技巧(2014)

image.png

CATransform3D操作api

//還原
 CATransform3DIdentity

//位移3D仿射  ==> (CGFloat tx, CGFloat ty, CGFloat tz)
CATransform3DMakeTranslation
CATransform3DTranslate        
//旋轉(zhuǎn)3D仿射 ==> (CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeRotation
CATransform3DRotate  
//縮放3D仿射 ==>  (CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale
CATransform3DScale
//疊加3D仿射效果
CATransform3DConcat    
//仿射基礎(chǔ)3D方法砂心,可以直接做效果疊加
CGAffineTransformMake (sx,shx,shy,sy,tx,ty)
//檢查是否有做過仿射3D效果  == ((CATransform3D t))
CATransform3DIsIdentity(transform)
//檢查2個3D仿射效果是否相同
CATransform3DEqualToTransform(transform1,transform2)
//3D仿射效果反轉(zhuǎn)(反效果,比如原來擴大蛇耀,就變成縮斜绲)
CATransform3DInvert(transform)

帶有Make的為構(gòu)建api,即創(chuàng)建一個CATransform3D類型的仿射變換纺涤。沒有帶Make一般為修改給定的仿射變換译暂,并返回修改后的仿射變換。如:

CATransform3D CATransform3DMakeTranslation(CGFloat tx, CGFloat ty, CGFloat tz); // 返回一個設(shè)定了轉(zhuǎn)移的仿射變換

CATransform3D CATransform3DTranslate(CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz); // 修改給定的`CATransform3D t`

CATransform3DConcat

類似的撩炊,和CGAffineTransformConcat一樣外永,用于連接兩個仿射變換,返回一個連接后的仿射變換拧咳。

CATransform3D CATransform3DConcat(CATransform3D a, CATransform3D b); // Concatenates b to a and returns the result: t = a * b.

結(jié)尾

下一章節(jié)伯顶,可以看看Core Animation中的動畫實現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骆膝,一起剝皮案震驚了整個濱河市祭衩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阅签,老刑警劉巖掐暮,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異政钟,居然都是意外死亡路克,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門养交,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷戈,“玉大人,你說我怎么就攤上這事层坠≈掣荆” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵破花,是天一觀的道長谦趣。 經(jīng)常有香客問我,道長座每,這世上最難降的妖魔是什么前鹅? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮峭梳,結(jié)果婚禮上舰绘,老公的妹妹穿的比我還像新娘蹂喻。我一直安慰自己,他們只是感情好捂寿,可當(dāng)我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布口四。 她就那樣靜靜地躺著,像睡著了一般秦陋。 火紅的嫁衣襯著肌膚如雪蔓彩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天驳概,我揣著相機與錄音赤嚼,去河邊找鬼。 笑死顺又,一個胖子當(dāng)著我的面吹牛更卒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稚照,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼逞壁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锐锣?” 一聲冷哼從身側(cè)響起腌闯,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雕憔,沒想到半個月后姿骏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡斤彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年分瘦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉苇。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘲玫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出并扇,到底是詐尸還是另有隱情去团,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布穷蛹,位于F島的核電站土陪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肴熏。R本人自食惡果不足惜鬼雀,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛙吏。 院中可真熱鬧源哩,春花似錦鞋吉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崩侠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坷檩,已是汗流浹背却音。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矢炼,地道東北人系瓢。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像句灌,于是被迫代替她去往敵國和親夷陋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容