IOS 圓球沿著橢圓軌跡做動(dòng)畫
前言:最近公司項(xiàng)目有個(gè)需求,需要實(shí)現(xiàn)讓一個(gè)view沿著橢圓軌跡做動(dòng)畫,效果實(shí)現(xiàn)后,就自己封裝做了一個(gè)小demo,使用更方便。先看效果:

橢圓.gif
效果圖中的白色橢圓軌跡線其實(shí)是用貝塞爾曲線畫出來(lái)的,為了清晰的看出來(lái)運(yùn)動(dòng)的軌跡。其實(shí)項(xiàng)目中是不顯示軌跡線的,也就是小球是懸空運(yùn)動(dòng)的。若不需要?jiǎng)h除掉即可。
實(shí)現(xiàn)步驟:
1.首先設(shè)定關(guān)鍵幀動(dòng)畫CAKeyframeAnimation的一些屬性,比如運(yùn)動(dòng)時(shí)間和重復(fù)次數(shù)和calculationMode模式,我們選擇kCAAnimationPaced 使得動(dòng)畫均勻進(jìn)行。
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; pathAnimation.calculationMode = kCAAnimationPaced; pathAnimation.fillMode = kCAFillModeForwards; pathAnimation.removedOnCompletion = NO; pathAnimation.duration = 5.0; pathAnimation.repeatCount = 2;
2.設(shè)定好關(guān)鍵幀動(dòng)畫的path,即一個(gè)橢圓形的路徑。需要使用CGPathAddArc,CGPathAddArc經(jīng)常用于畫正圓,比如下面就是一個(gè)正圓,各個(gè)參數(shù)的意義:
//160,200為圓心,100為半徑 (startAngle,endAngle)為起始角度和結(jié)束角度,1為順時(shí)針,0 為逆時(shí)針
CGPathAddArc(curvedPath, NULL, 160,200, 100, startAngle, endAngle, 0);
需要注意的是由于iOS中的坐標(biāo)體系是和Quartz坐標(biāo)體系中Y軸相反的,所以iOS UIView在做Quartz繪圖時(shí),Y軸已經(jīng)做了Scale為-1的轉(zhuǎn)換,因此造成CGPathAddArc函數(shù)最后一個(gè)是否是順時(shí)針的參數(shù)結(jié)果正好是相反的,也就是說如果設(shè)置最后的參數(shù)為YES,根據(jù)參數(shù)定義應(yīng)該是順時(shí)針的,但實(shí)際繪圖結(jié)果會(huì)是逆時(shí)針的!
我們需要畫的是橢圓啊,別急,接下來(lái)稍作更改即可。正圓第二個(gè)參數(shù)默認(rèn)為NULL,我們要改成橢圓,
//短半軸和長(zhǎng)半軸的比例
float radiuscale = 0.5;
//橢圓頂點(diǎn)的坐標(biāo)值
CGFloat origin_x = self.frame.size.width/2;
CGFloat origin_y = self.frame.size.height/2;
//長(zhǎng)半軸的長(zhǎng)
CGFloat radiusX = 100;
CGMutablePathRef curvedPath = CGPathCreateMutable();
CGAffineTransform t2 = CGAffineTransformConcat(CGAffineTransformConcat(
CGAffineTransformMakeTranslation(-origin_x, -origin_y),
CGAffineTransformMakeScale(1, radiuscale)),
CGAffineTransformMakeTranslation(origin_x, origin_y));
CGPathAddArc(curvedPath, &t2, origin_x, origin_y, radiusX,startAngle,endAngle, 1);
pathAnimation.path = curvedPath;
CGPathRelease(curvedPath);
好了,至此,動(dòng)畫的軌跡和屬性都寫好了。添加到view上就ok了。
3.貝塞爾畫橢圓
如果是整個(gè)橢圓的話,只需要設(shè)定好理想中的橢圓的外切圓即可。
//整個(gè)橢圓 CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); UIBezierPath *arc = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(origin_x-100, origin_y-50, 200, 100)]; [[UIColor whiteColor] setStroke]; [arc stroke]; CGContextRestoreGState(context);
總結(jié): 希望本文能對(duì)你有幫助。如果你有更好的想法,歡迎和我交流!
demo地址:https://github.com/xiaochenyi/CircleAnimateDemo
文/秋雨W(簡(jiǎn)書作者)
原文鏈接:http://www.jianshu.com/p/d8cc02e7efa7
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”。
相關(guān)文章
詳解iOS App開發(fā)中UIViewController的loadView方法使用
這篇文章主要介紹了詳解iOS App開發(fā)中UIViewController的loadView方法使用,講解了訪問view屬性時(shí)loadView方法的調(diào)用及使用loadView時(shí)的一些注意點(diǎn),需要的朋友可以參考下2016-03-03
詳解iOS 驗(yàn)證碼輸入的實(shí)現(xiàn)思路
這篇文章主要介紹了iOS 驗(yàn)證碼輸入一種實(shí)現(xiàn)思路,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
iOS 讀取URL圖片并存儲(chǔ)到本地的實(shí)例
下面小編就為大家?guī)?lái)一篇iOS 讀取URL圖片并存儲(chǔ)到本地的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2017-12-12
iOS實(shí)現(xiàn)自定義起始時(shí)間選擇器視圖
本篇文章主要介紹了iOS實(shí)現(xiàn)自定義起始時(shí)間選擇器視圖,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-06-06
iOS 監(jiān)聽回調(diào)機(jī)制KVO實(shí)例
下面小編就為大家分享一篇iOS 監(jiān)聽回調(diào)機(jī)制KVO實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-01-01
Objective-C中編程中一些推薦的書寫規(guī)范小結(jié)
這篇文章主要介紹了Objective-C的一些編程書寫規(guī)范小結(jié),包括類與方法等面向?qū)ο缶幊滔嚓P(guān)的代碼編寫風(fēng)格,需要的朋友可以參考下2016-04-04

