您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關iOS如何將CALayer旋轉360的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
什么是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.352071 0.730180 1.101104 1.477982 1.833467 2.189324 2.550581 2.915682 3.273214 3.649389 4.013420 4.376663 4.740999 5.113640 5.483836 5.861515 6.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矩陣的基本數值。可以看出m11,m12,m21,m22也是各自呈線性變化。
0.982547, -0.186012, 0.000000, 0.000000 0.186012, 0.982547, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.930553, -0.366158, 0.000000, 0.000000 0.366158, 0.930553, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.830170, -0.557510, 0.000000, 0.000000 0.557510, 0.830170, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.700345, -0.713804, 0.000000, 0.000000 0.713804, 0.700345, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.560556, -0.828117, 0.000000, 0.000000 0.828117, 0.560556, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.403126, -0.915145, 0.000000, 0.000000 0.915145, 0.403126, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.221203, -0.975228, 0.000000, 0.000000 0.975228, 0.221203, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- 0.030679, -0.999529, 0.000000, 0.000000 0.999529, 0.030679, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.158010, -0.987438, 0.000000, 0.000000 0.987438, -0.158010, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.347984, -0.937500, 0.000000, 0.000000 0.937500, -0.347984, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.517222, -0.855851, 0.000000, 0.000000 0.855851, -0.517222, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.672144, -0.740421, 0.000000, 0.000000 0.740421, -0.672144, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.812617, -0.582798, 0.000000, 0.000000 0.582798, -0.812617, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.905049, -0.425307, 0.000000, 0.000000 0.425307, -0.905049, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.969663, -0.244444, 0.000000, 0.000000 0.244444, -0.969663, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 --------- -0.998409, -0.056390, 0.000000, 0.000000 0.056390, -0.998409, 0.000000, 0.000000 0.000000, 0.000000, 1.000000, 0.000000 0.000000, 0.000000, 0.000000, 1.000000 ---------
這也就解釋了為什么0到360度的動畫直接不執行了,因為0和360度的矩陣一模一樣,也就無法計算出任何插值。
感謝各位的閱讀!關于“iOS如何將CALayer旋轉360”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。