成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

iOS如何將CALayer旋轉(zhuǎn)360-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)iOS如何將CALayer旋轉(zhuǎn)360的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。

什么是CALayer

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

* 其實(shí)UIView之所以能顯示在屏幕上,完全是因?yàn)樗鼉?nèi)部的一個(gè)層。

* 在創(chuàng)建UIView對(duì)象時(shí),UIView內(nèi)部會(huì)自動(dòng)創(chuàng)建一個(gè)層(即CALayer對(duì)象),通過UIView的layer屬性可以訪問這個(gè)層。當(dāng)UIView需要顯示到屏幕上時(shí),會(huì)調(diào)用 drawRect:方法進(jìn)行繪圖,并且會(huì)將所有內(nèi)容繪制在自己的層上,繪圖完畢后,系統(tǒng)會(huì)將層拷貝到屏幕上,于是就完成了UIView的顯示。

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

引言

不知你是否遇到過將CALayer旋轉(zhuǎn)360度的需求,如果有的話,你也許會(huì)嘗試使用transform做旋轉(zhuǎn)動(dòng)畫,然后發(fā)現(xiàn)。。。CALayer根本就不動(dòng)。本文將深入解釋并解決這個(gè)問題。

transform.rotation

CABasicAnimation支持transform.rotation這個(gè)keyPath,你可以將這個(gè)值從0改變到2pi進(jìn)行動(dòng)畫。transform.rotation是繞z軸旋轉(zhuǎn)。當(dāng)然你也可以指定繞哪個(gè)軸旋轉(zhuǎn),比如x軸就是transform.rotation.x。這個(gè)可動(dòng)畫屬性能夠完美的實(shí)現(xiàn)旋轉(zhuǎn)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;

動(dòng)畫插值

我們知道動(dòng)畫要想平滑,就得在我們給的from和to之間進(jìn)行插值然后渲染這些插值情況下的幀。那么這些值是怎么插的呢?我們可以自定義一個(gè)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告訴系統(tǒng)rotateX修改后需要刷新顯示,display則負(fù)責(zé)刷新顯示,因?yàn)楸粍?dòng)畫的屬性值都在presentationLayer中,所以我們從presentationLayer中取rotateX的最新值。下面是動(dòng)畫過程中打印出來的rotateX的值?;揪褪且粋€(gè)線性的變化過程,因?yàn)槲覜]有設(shè)置任何時(shí)間函數(shù)。rotateX是一個(gè)CGFloat,那如果是CATransform3D呢?會(huì)怎么變化?

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的插值

我新增了一個(gè)Animatable的屬性customMatrix來查看CATransform3D類型的屬性是如何插值的。CATransform3D其實(shí)是一個(gè)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];
}

下面是部分?jǐn)?shù)據(jù),我用的是繞z軸旋轉(zhuǎn)的矩陣,所以只有m11,m12,m21,m22有數(shù)據(jù),其他都是Identity矩陣的基本數(shù)值。可以看出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度的動(dòng)畫直接不執(zhí)行了,因?yàn)?和360度的矩陣一模一樣,也就無法計(jì)算出任何插值。

感謝各位的閱讀!關(guān)于“iOS如何將CALayer旋轉(zhuǎn)360”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站jinyejixie.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:iOS如何將CALayer旋轉(zhuǎn)360-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://jinyejixie.com/article4/djepoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、App開發(fā)網(wǎng)站內(nèi)鏈、品牌網(wǎng)站制作網(wǎng)站營銷、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
阆中市| 镇江市| 长治县| 荆门市| 嵩明县| 若羌县| 清水县| 镇康县| 团风县| 施甸县| 岑溪市| 信阳市| 海安县| 北京市| 新乡市| 讷河市| 普洱| 湛江市| 郑州市| 怀来县| 武定县| 灯塔市| 渝北区| 家居| 利辛县| 临洮县| 玉山县| 丹寨县| 镶黄旗| 寿光市| 玉门市| 吉木乃县| 电白县| 塔城市| 奇台县| 邯郸市| 连山| 五常市| 大洼县| 蓝田县| 东兰县|