手把手教你使用Core animation 做動畫(下)

手把手教你使用Core animation 做動畫(下)

來源:Airfei

鏈接:http://www.reibang.com/p/1e2b8ff3519e

2.上下橫線的動畫效果挂脑。

此動畫效果戚长,需要使用transform.rotation.z轉動角度。

上橫線轉動的角度順序為 0 -> 10° -> (-55°) -> (-45°)

這是一組數(shù)據(jù),使用關鍵幀處理動畫。

CAKeyframeAnimation *rotationAnimation1 = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

? ?rotationAnimation1.values = @[[NSNumber numberWithFloat:0],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:Radians(10) ],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:Radians(-10) - M_PI_4 ],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:- M_PI_4 ]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ];

下橫線轉動的角度順序為0 -> (-10°) -> (55°) -> (45°)

CAKeyframeAnimation *rotationAnimation2 = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

? ?rotationAnimation2.values = @[[NSNumber numberWithFloat:0],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:Radians(-10) ],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:Radians(10) ?+ M_PI_4 ],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat: M_PI_4 ]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ];

你認為這么就結束了? 最終結束的動畫如下:

發(fā)現(xiàn)相交的直線沒有居中除秀,而是靠左顯示。

向左平移,使用transform.translation.x

//平移量

? ?CGFloat toValue = lineWidth *(1- cos(M_PI_4)) /2.0;

即旋轉角度又發(fā)生偏移量瓢剿,使用組合動畫。

上橫線組合動畫

//平移x

? ?CABasicAnimation *translationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];

? ?translationAnimation.fromValue = [NSNumber numberWithFloat:0];

? ?translationAnimation.toValue = [NSNumber numberWithFloat:-toValue];

//角度關鍵幀 上橫線的關鍵幀 0 - 10° - (-55°) - (-45°)

CAKeyframeAnimation *rotationAnimation1 = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

rotationAnimation1.values = @[[NSNumber numberWithFloat:0],

[NSNumber numberWithFloat:Radians(10) ],

[NSNumber numberWithFloat:Radians(-10) - M_PI_4 ],

[NSNumber numberWithFloat:- M_PI_4 ]

];

CAAnimationGroup *transformGroup1 = [CAAnimationGroup animation];

transformGroup1.animations = [NSArray arrayWithObjects:rotationAnimation1,translationAnimation, nil];

transformGroup1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

transformGroup1.duration = kStep3Duration;

transformGroup1.removedOnCompletion = YES;

[_topLineLayer addAnimation:transformGroup1 forKey:nil];

下橫線組合動畫

//角度關鍵幀 下橫線的關鍵幀 0 - (-10°) - (55°) - (45°)

? ?CAKeyframeAnimation *rotationAnimation2 = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

? ?rotationAnimation2.values = @[[NSNumber numberWithFloat:0],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:Radians(-10) ],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat:Radians(10) + M_PI_4 ],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [NSNumber numberWithFloat: M_PI_4 ]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ];

CAAnimationGroup *transformGroup2 = [CAAnimationGroup animation];

transformGroup2.animations = [NSArray arrayWithObjects:rotationAnimation2,translationAnimation, nil];

transformGroup2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

transformGroup2.duration = kStep3Duration ;

transformGroup2.delegate = self;

transformGroup2.removedOnCompletion = YES;

[_bottomLineLayer addAnimation:transformGroup2 forKey:nil];

Part1到此結束悠轩。最終效果圖

Part2的思路和Part1思路是一樣的间狂。你可以參考代碼自己思考一下。核心代碼

-(void)cancelAnimation

{

? ?//最關鍵是path路徑

UIBezierPath *path = [UIBezierPath bezierPath];

//30度,經過反復測試火架,效果最好

CGFloat angle = Radians(30);

CGFloat startPointX = self.center.x + Raduis * cos(angle);

CGFloat startPointY = kCenterY - Raduis * sin(angle);

CGFloat controlPointX = self.center.x + Raduis *acos(angle);

CGFloat controlPointY = kCenterY;

CGFloat endPointX = self.center.x + lineWidth /2;

CGFloat endPointY = kCenterY;

//組合path 路徑 起點 -150° 順時針的圓

path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x,kCenterY)

radius:Raduis

startAngle:-M_PI + angle

endAngle:M_PI + angle

clockwise:YES];

//起點為 180°-> (360°-30°)

UIBezierPath *path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x,kCenterY)

radius:Raduis

startAngle:M_PI + angle

endAngle:2 * M_PI - angle

clockwise:YES];

[path appendPath:path1];

//三點曲線

UIBezierPath *path2 = [UIBezierPath bezierPath];

[path2 moveToPoint:CGPointMake(startPointX, startPointY)];

[path2 addCurveToPoint:CGPointMake(endPointX,endPointY)

controlPoint1:CGPointMake(startPointX, startPointY)

controlPoint2:CGPointMake(controlPointX, controlPointY)];

[path appendPath:path2];

//比原始狀態(tài)向左偏移5個像素

UIBezierPath *path3 = [UIBezierPath bezierPath];

[path3 moveToPoint:CGPointMake(endPointX,endPointY)];

[path3 addLineToPoint:CGPointMake(self.center.x - lineWidth/2 -5,endPointY)];

[path appendPath:path3];

_changedLayer.path = path.CGPath;

//平移量

CGFloat toValue = lineWidth *(1- cos(M_PI_4)) /2.0;

//finished 最終狀態(tài)

CGAffineTransform transform1 = CGAffineTransformMakeRotation(0);

CGAffineTransform transform2 = CGAffineTransformMakeTranslation(0, 0);

CGAffineTransform transform3 = CGAffineTransformMakeRotation(0);

CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2);

_topLineLayer.affineTransform = transform;

transform = CGAffineTransformConcat(transform3, transform2);

_bottomLineLayer.affineTransform = transform;

//一個圓的長度比

CGFloat endPercent = 2* M_PI *Raduis / ([self calculateTotalLength] + lineWidth);

//橫線占總path的百分比

CGFloat percent = lineWidth / ([self calculateTotalLength] + lineWidth);

_changedLayer.strokeStart = 1.0 -percent;

CAKeyframeAnimation *startAnimation = [CAKeyframeAnimation animationWithKeyPath:@"strokeStart"];

startAnimation.values = @[@0.0,@0.3,@(1.0 -percent)];

//在π+ angle

CAKeyframeAnimation *EndAnimation = [CAKeyframeAnimation animationWithKeyPath:@"strokeEnd"];

EndAnimation.values = @[@(endPercent),@(endPercent),@1.0];

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];

animationGroup.animations = [NSArray arrayWithObjects:startAnimation,EndAnimation, nil];

animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animationGroup.duration = kStep4Duration;

animationGroup.delegate = self;

animationGroup.removedOnCompletion = YES;

[animationGroup setValue:@"animationStep4" forKey:@"animationName"];

[_changedLayer addAnimation:animationGroup forKey:nil];

//平移x

CABasicAnimation *translationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];

translationAnimation.fromValue = [NSNumber numberWithFloat:-toValue];

translationAnimation.toValue = [NSNumber numberWithFloat:0];

//角度關鍵幀 上橫線的關鍵幀 ?(-45°) -> (-55°)-> 10° -> 0

CAKeyframeAnimation *rotationAnimation1 = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

rotationAnimation1.values = @[[NSNumber numberWithFloat:- M_PI_4 ],

[NSNumber numberWithFloat:- Radians(10) - M_PI_4 ],

[NSNumber numberWithFloat:Radians(10) ],

[NSNumber numberWithFloat:0]

];

CAAnimationGroup *transformGroup1 = [CAAnimationGroup animation];

transformGroup1.animations = [NSArray arrayWithObjects:rotationAnimation1,translationAnimation, nil];

transformGroup1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

transformGroup1.duration = kStep4Duration;

transformGroup1.removedOnCompletion = YES;

[_topLineLayer addAnimation:transformGroup1 forKey:nil];

//角度關鍵幀 下橫線的關鍵幀 ?(45°)-> (55°)- >(-10°)-> 0

CAKeyframeAnimation *rotationAnimation2 = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

rotationAnimation2.values = @[[NSNumber numberWithFloat: M_PI_4 ],

[NSNumber numberWithFloat:Radians(10) + M_PI_4 ],

[NSNumber numberWithFloat:-Radians(10) ],

[NSNumber numberWithFloat:0]

];

CAAnimationGroup *transformGroup2 = [CAAnimationGroup animation];

transformGroup2.animations = [NSArray arrayWithObjects:rotationAnimation2,translationAnimation, nil];

transformGroup2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

transformGroup2.duration = kStep4Duration;

transformGroup2.delegate = self;

transformGroup2.removedOnCompletion = YES;

[_bottomLineLayer addAnimation:transformGroup2 forKey:nil];

}

最終效果圖:

本篇文章講解結束鉴象!

閱讀 6765 投訴

寫留言

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市距潘,隨后出現(xiàn)的幾起案子炼列,更是在濱河造成了極大的恐慌,老刑警劉巖音比,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俭尖,死亡現(xiàn)場離奇詭異,居然都是意外死亡洞翩,警方通過查閱死者的電腦和手機稽犁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骚亿,“玉大人已亥,你說我怎么就攤上這事±赐溃” “怎么了虑椎?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵震鹉,是天一觀的道長。 經常有香客問我捆姜,道長传趾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任泥技,我火速辦了婚禮浆兰,結果婚禮上,老公的妹妹穿的比我還像新娘珊豹。我一直安慰自己簸呈,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布店茶。 她就那樣靜靜地躺著蜕便,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忽妒。 梳的紋絲不亂的頭發(fā)上玩裙,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音段直,去河邊找鬼吃溅。 笑死,一個胖子當著我的面吹牛鸯檬,可吹牛的內容都是我干的决侈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼喧务,長吁一口氣:“原來是場噩夢啊……” “哼赖歌!你這毒婦竟也來了?” 一聲冷哼從身側響起功茴,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤庐冯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坎穿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展父,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年玲昧,在試婚紗的時候發(fā)現(xiàn)自己被綠了栖茉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡孵延,死狀恐怖吕漂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情尘应,我是刑警寧澤惶凝,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布吼虎,位于F島的核電站,受9級特大地震影響苍鲜,放射性物質發(fā)生泄漏鲸睛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一坡贺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱舞,春花似錦遍坟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至电湘,卻和暖如春隔节,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寂呛。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工怎诫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贷痪。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓幻妓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劫拢。 傳聞我的和親對象是個殘疾皇子肉津,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容