亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS優雅的將CALayer旋轉360度示例代碼

2020-07-26 02:32:19
字體:
來源:轉載
供稿:網友

什么是CALayer

* 在iOS系統中,你能看得見摸得著的東西基本上都是UIView,比如一個按鈕、一個文本標簽、一個文本輸入框、一個圖標等等,這些都是UIView。

* 其實UIView之所以能顯示在屏幕上,完全是因為它內部的一個層。

* 在創建UIView對象時,UIView內部會自動創建一個層(即CALayer對象),通過UIView的layer屬性可以訪問這個層。當UIView需要顯示到屏幕上時,會調用 drawRect:方法進行繪圖,并且會將所有內容繪制在自己的層上,繪圖完畢后,系統會將層拷貝到屏幕上,于是就完成了UIView的顯示。

* 換句話說,UIView本身不具備顯示的功能,是它內部的層才有顯示功能。

引言

不知你是否遇到過將CALayer旋轉360度的需求,如果有的話,你也許會嘗試使用transform做旋轉動畫,然后發現。。。CALayer根本就不動。本文將深入解釋并解決這個問題。

transform.rotation

CABasicAnimation支持transform.rotation這個keyPath,你可以將這個值從0改變到2pi進行動畫。transform.rotation是繞z軸旋轉。當然你也可以指定繞哪個軸旋轉,比如x軸就是transform.rotation.x。這個可動畫屬性能夠完美的實現旋轉360度的需求。那么問題來了,既然它可以,為什么我這么寫就不可以呢?我也是從0度的transform到360度的transform呀。

CATransform3D start = CATransform3DMakeRotation(0 * M_PI / 180.0, 0, 0, 1);CATransform3D end = CATransform3DMakeRotation(2 * M_PI / 180.0, 0, 0, 1);CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];animation.fromValue = [NSValue valueWithCATransform3D:start];animation.toValue = [NSValue valueWithCATransform3D:end];animation.duration = 3.3;

動畫插值

我們知道動畫要想平滑,就得在我們給的from和to之間進行插值然后渲染這些插值情況下的幀。那么這些值是怎么插的呢?我們可以自定義一個Animatable的屬性看看。下面是自定義Animatable的rotateX屬性需要的代碼。

@implementation HTCardLayer- (void)setRotateX:(CGFloat)rotateX { _rotateX = rotateX; CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / -300.0; self.transform = CATransform3DRotate(transform, rotateX, 1, 0, 0);}- (void)display { CGFloat rotateX = [(HTCardLayer *)self.presentationLayer rotateX]; NSLog(@"%lf", rotateX); CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / -300.0; self.transform = CATransform3DRotate(transform, rotateX, 1, 0, 0);}+ (BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"rotateX"]) { return YES; } return [super needsDisplayForKey:key];}@end

needsDisplayForKey告訴系統rotateX修改后需要刷新顯示,display則負責刷新顯示,因為被動畫的屬性值都在presentationLayer中,所以我們從presentationLayer中取rotateX的最新值。下面是動畫過程中打印出來的rotateX的值?;揪褪且粋€線性的變化過程,因為我沒有設置任何時間函數。rotateX是一個CGFloat,那如果是CATransform3D呢?會怎么變化?

0.3520710.7301801.1011041.4779821.8334672.1893242.5505812.9156823.2732143.6493894.0134204.3766634.7409995.1136405.4838365.8615156.234217

CATransform3D的插值

我新增了一個Animatable的屬性customMatrix來查看CATransform3D類型的屬性是如何插值的。CATransform3D其實是一個4x4的矩陣。

- (void)display { CGFloat rotateX = [(HTCardLayer *)self.presentationLayer rotateX]; CATransform3D customMatrix = [(HTCardLayer *)self.presentationLayer customMatrix];// NSLog(@"%lf", rotateX); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m11, customMatrix.m12, customMatrix.m13, customMatrix.m14); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m21, customMatrix.m22, customMatrix.m23, customMatrix.m24); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m31, customMatrix.m32, customMatrix.m33, customMatrix.m34); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m41, customMatrix.m42, customMatrix.m43, customMatrix.m44); NSLog(@"---------"); CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / -300.0; self.transform = CATransform3DRotate(transform, rotateX, 1, 0, 0);}+ (BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"rotateX"]) {  return YES; } if ([key isEqualToString:@"customMatrix"]) {  return YES; } return [super needsDisplayForKey:key];}

下面是部分數據,我用的是繞z軸旋轉的矩陣,所以只有m11,m12,m21,m22有數據,其他都是Identity矩陣的基本數值??梢钥闯鰉11,m12,m21,m22也是各自呈線性變化。

0.982547, -0.186012, 0.000000, 0.0000000.186012, 0.982547, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.930553, -0.366158, 0.000000, 0.0000000.366158, 0.930553, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.830170, -0.557510, 0.000000, 0.0000000.557510, 0.830170, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.700345, -0.713804, 0.000000, 0.0000000.713804, 0.700345, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.560556, -0.828117, 0.000000, 0.0000000.828117, 0.560556, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.403126, -0.915145, 0.000000, 0.0000000.915145, 0.403126, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.221203, -0.975228, 0.000000, 0.0000000.975228, 0.221203, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.030679, -0.999529, 0.000000, 0.0000000.999529, 0.030679, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.158010, -0.987438, 0.000000, 0.0000000.987438, -0.158010, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.347984, -0.937500, 0.000000, 0.0000000.937500, -0.347984, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.517222, -0.855851, 0.000000, 0.0000000.855851, -0.517222, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.672144, -0.740421, 0.000000, 0.0000000.740421, -0.672144, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.812617, -0.582798, 0.000000, 0.0000000.582798, -0.812617, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.905049, -0.425307, 0.000000, 0.0000000.425307, -0.905049, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.969663, -0.244444, 0.000000, 0.0000000.244444, -0.969663, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.998409, -0.056390, 0.000000, 0.0000000.056390, -0.998409, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------

這也就解釋了為什么0到360度的動畫直接不執行了,因為0和360度的矩陣一模一樣,也就無法計算出任何插值。

總結

總而言之,如果你想360度旋轉CALayer,要么使用transform.rotation,要么就自定義Animatable的屬性。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品99久久久久久人| 日韩av电影手机在线| 国产一区视频在线| 欧美激情网站在线观看| 国产精品美女视频网站| 热久久99这里有精品| 日韩成人在线观看| 国产美女91呻吟求| 欧日韩不卡在线视频| 日韩欧美国产黄色| 国产成人拍精品视频午夜网站| 欧美国产第一页| 成人激情视频小说免费下载| 国产一区二区精品丝袜| 日韩免费av一区二区| 亚洲精品福利在线观看| 亚洲国产私拍精品国模在线观看| 性亚洲最疯狂xxxx高清| 久久久国产精品亚洲一区| 国产亚洲免费的视频看| 一个色综合导航| 插插插亚洲综合网| 亲爱的老师9免费观看全集电视剧| 亚洲欧美色婷婷| 亚洲人在线视频| 日韩高清有码在线| 中文字幕亚洲欧美一区二区三区| 日韩视频永久免费观看| 精品av在线播放| 日韩高清不卡av| 成人一区二区电影| 国产69精品久久久久9999| 日韩专区在线观看| 成人精品久久久| 最新中文字幕亚洲| xxx成人少妇69| 国产精品久久久久久久久久久久| 97精品国产97久久久久久春色| 国产精品偷伦视频免费观看国产| 色综合久久精品亚洲国产| 国产精品久久久久久搜索| 久久精品视频播放| 国产视频福利一区| 亚洲国产97在线精品一区| 国产欧美精品一区二区三区-老狼| 国产精品成av人在线视午夜片| 岛国av一区二区在线在线观看| 国产亚洲综合久久| 欧美疯狂性受xxxxx另类| 91亚洲精品在线观看| 色噜噜久久综合伊人一本| 亚洲激情视频网站| 亚洲激情成人网| 国产精品成人一区| 亚洲小视频在线观看| 欧美又大又粗又长| 久久91亚洲人成电影网站| 91精品免费久久久久久久久| 日韩美女免费视频| 亚洲人成在线观看| 97超碰蝌蚪网人人做人人爽| 久久精品一本久久99精品| 欧美精品www在线观看| 亚洲精品永久免费精品| 亚洲一区亚洲二区亚洲三区| 91精品国产综合久久男男| 亚洲一区二区三区四区在线播放| 国产成人一区二区三区电影| 国产精品成人观看视频国产奇米| 欧美国产日韩xxxxx| 久久99视频免费| 欧美激情欧美激情| 欧美一区二区三区图| 美女啪啪无遮挡免费久久网站| 国产精品免费小视频| 欧美高清videos高潮hd| 日韩精品中文字幕视频在线| 亚洲精品视频久久| 中文字幕亚洲专区| 欧美午夜激情在线| 成人免费在线视频网址| 欧美国产日韩免费| 亚洲天堂av综合网| 亚洲欧美国产精品专区久久| 欧美xxxwww| 国产手机视频精品| 亚洲成色777777在线观看影院| 日韩久久精品成人| 精品国产成人在线| 国产一区二区日韩精品欧美精品| 欧美成aaa人片免费看| 亚洲最大激情中文字幕| 国产亚洲一区精品| 欧美中文字幕在线播放| 国产精品免费在线免费| 俺去了亚洲欧美日韩| 色婷婷av一区二区三区久久| 亚洲欧美激情在线视频| 日韩国产欧美精品在线| 久久五月情影视| 精品久久久久久久久久ntr影视| 国产精品自拍偷拍| 欧美激情a在线| 最近中文字幕日韩精品| 欧美大码xxxx| 日韩视频免费在线观看| 97精品久久久| 色综合久久悠悠| 狠狠躁夜夜躁人人躁婷婷91| 国产精品视频在线观看| 在线成人免费网站| 亚洲免费一在线| 久久久久久免费精品| 亚洲精选一区二区| 92福利视频午夜1000合集在线观看| 亚洲精品日韩久久久| 久操成人在线视频| 欧美日韩一区免费| 欧美一级黄色网| 日韩视频在线一区| 久久久久久有精品国产| 大荫蒂欧美视频另类xxxx| 国产精品伦子伦免费视频| 亚洲欧美日韩一区二区三区在线| 97超碰蝌蚪网人人做人人爽| 欧美在线视频网| 色在人av网站天堂精品| 精品国产乱码久久久久久虫虫漫画| 亚洲男人第一网站| 亚洲第一av网站| 日韩av在线电影网| 亚洲夜晚福利在线观看| 狠狠做深爱婷婷久久综合一区| www.亚洲一区| 亚洲xxx视频| 97超级碰碰碰| 北条麻妃久久精品| 亚洲精品久久久久| 国产精品久久久久久久7电影| 国产精品一区二区久久国产| 亚洲午夜久久久久久久| 国产亚洲视频中文字幕视频| 成人444kkkk在线观看| 国产精品一区二区久久精品| 中文字幕日韩精品有码视频| 国产美女精彩久久| 国产日本欧美在线观看| 成人亚洲综合色就1024| 欧美日韩成人在线播放| 欧美精品在线免费| 91美女高潮出水| 精品视频久久久久久| 国产欧美日韩亚洲精品| 中文字幕在线看视频国产欧美| 国产精品一区二区久久国产| 在线视频免费一区二区| 国产精品入口免费视| 91亚洲午夜在线| 97精品国产aⅴ7777| 国产精品久久久久免费a∨| 国产99久久久欧美黑人| 欧美国产日韩一区二区在线观看| 国产午夜精品一区理论片飘花| 亚洲欧美在线免费|