iOS中利用CoreAnimation實(shí)現(xiàn)一個(gè)時(shí)間的進(jìn)度條效果
在iOS中實(shí)現(xiàn)進(jìn)度條通常都是通過(guò)不停的設(shè)置progress來(lái)完成的,這樣的進(jìn)度條適用于網(wǎng)絡(luò)加載(上傳下載文件、圖片等)。但是對(duì)于錄制視頻這樣的需求的話,如果是按照每秒來(lái)設(shè)置進(jìn)度的話,顯得有點(diǎn)麻煩,于是我就想直接用CoreAnimation來(lái)按時(shí)間做動(dòng)畫(huà),只要設(shè)置最大時(shí)間,其他的就不用管了,然后在視頻暫停與繼續(xù)錄制時(shí),對(duì)動(dòng)畫(huà)進(jìn)行暫停和恢復(fù)即可。錄制視頻的效果如下:
你可以在這里下載demo
那么接下來(lái)就是如何用CoreAnimation實(shí)現(xiàn)一個(gè)進(jìn)度條控件了。
首先呢,讓我們創(chuàng)建一個(gè)繼承自CAShapeLayer的WKProgressBarLayer。
WKProgressBarLayer默認(rèn)自身的bounds就是整個(gè)進(jìn)度條的大小。
@interface WKProgressBarLayer : CAShapeLayer @end
為了方便外部調(diào)用,首先在WKProgressBarLayer.h中定義枚舉來(lái)表明動(dòng)畫(huà)的四個(gè)狀態(tài)
typedef NS_ENUM(NSInteger, WKAnimationStatus) { WKAnimationStatusIdle,//空閑 WKAnimationStatusAnimating,//動(dòng)畫(huà)中 WKAnimationStatusPause,//暫停 WKAnimationStatusComplete//完成 };
接下來(lái),定義外部調(diào)用的動(dòng)畫(huà)接口
@interface WKProgressBarLayer : CAShapeLayer @property (nonatomic, assign, readonly) WKAnimationStatus animatingStatus;//狀態(tài) /** 開(kāi)始動(dòng)畫(huà) @param duration 動(dòng)畫(huà)最大時(shí)長(zhǎng) */ - (void)beginAnimationWithDuration:(CGFloat)duration; /** 暫停 */ - (void)pauseAnimation; /** 恢復(fù) */ - (void)resumeAnimation; /** 重新開(kāi)始動(dòng)畫(huà) @param progress 從哪個(gè)進(jìn)度開(kāi)始 @param duration 動(dòng)畫(huà)最大時(shí)長(zhǎng) */ - (void)restartAnimationWithProgress:(CGFloat)progress duration:(NSTimeInterval)duration; @end
然后,我們?cè)?m實(shí)現(xiàn)核心的動(dòng)畫(huà)開(kāi)始方法startAnimtionWithBeginProgress:duration:,詳細(xì)解釋見(jiàn)代碼
- (void)startAnimtionWithBeginProgress:(CGFloat)beginProgress duration:(NSTimeInterval)duration { [self reset];//重置動(dòng)畫(huà) //設(shè)置path UIBezierPath *fromPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, beginProgress * self.bounds.size.width, self.bounds.size.height)];; UIBezierPath *toPath = [UIBezierPath bezierPathWithRect:self.bounds]; self.path = fromPath.CGPath; //創(chuàng)建動(dòng)畫(huà) CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"]; animation.fromValue = (id)fromPath.CGPath; animation.toValue = (id)toPath.CGPath; animation.duration = duration; [animation setValue:@1 forKey:@"progress"];//用于判斷是否是進(jìn)度動(dòng)畫(huà) animation.delegate = self; //用于判斷動(dòng)畫(huà)結(jié)束 [self addAnimation:animation forKey:@"progressAnimation"]; self.path = toPath.CGPath; }
然后呢,需要在動(dòng)畫(huà)的delegate與暫停、恢復(fù)動(dòng)畫(huà)的方法中分別修改動(dòng)畫(huà)的狀態(tài)
- (void)pauseAnimation { CFTimeInterval pausedTime = [self convertTime:CACurrentMediaTime() fromLayer:nil]; self.speed = 0.0; self.timeOffset = pausedTime; self.animatingStatus = WKAnimationStatusPause; } - (void)resumeAnimation { CFTimeInterval pausedTime = [self timeOffset]; self.speed = 1.0; self.timeOffset = 0.0; self.beginTime = 0.0; CFTimeInterval timeSincePause = [self convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; self.beginTime = timeSincePause; self.animatingStatus = WKAnimationStatusAnimating; } #pragma mark - CAAnimationDelegate /* Called when the animation begins its active duration. */ - (void)animationDidStart:(CAAnimation *)anim { if (anim == [self animationForKey:@"progressAnimation"]) {//判斷進(jìn)度動(dòng)畫(huà) self.animatingStatus = WKAnimationStatusAnimating; } } - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { if ([anim valueForKey:@"progress"] && flag == YES) {//判斷進(jìn)度動(dòng)畫(huà) self.animatingStatus = WKAnimationStatusComplete; } }
至此,進(jìn)度條layer就完成了,現(xiàn)在創(chuàng)建一個(gè)控制器來(lái)做測(cè)試
首先在storyBoard擺上兩個(gè)按鈕,分別是開(kāi)始與重置動(dòng)畫(huà)(界面搭建很簡(jiǎn)單,詳情見(jiàn)demo)
然后在ViewDidLoad中添加progressLayer
- (void)viewDidLoad { [super viewDidLoad]; WKProgressBarLayer *progressLayer = [[WKProgressBarLayer alloc] init]; progressLayer.frame = CGRectMake(100, 100, 200, 10); [self.view.layer addSublayer:progressLayer]; self.progressLayer = progressLayer; }
接下來(lái),就是動(dòng)畫(huà)開(kāi)始與重置響應(yīng)
- (IBAction)startOrPauseAction:(UIButton *)sender { switch (self.progressLayer.animatingStatus) { case WKAnimationStatusIdle:{ [self.progressLayer beginAnimationWithDuration:10]; } break; case WKAnimationStatusAnimating:{ [self.progressLayer pauseAnimation]; } break; case WKAnimationStatusPause:{ [self.progressLayer resumeAnimation]; } break; case WKAnimationStatusComplete:{ [self.progressLayer restartAnimationWithProgress:0 duration:10]; } break; default: break; } sender.selected = !sender.selected; } - (IBAction)resetAction:(UIButton *)sender { [self.progressLayer restartAnimationWithProgress:0 duration:10]; self.startOrPauseButton.selected = YES; }
以上就是代碼主體了,接下來(lái),讓我們看看效果
你可以在這里下載demo
總結(jié)
以上所述是小編給大家介紹的iOS中利用CoreAnimation實(shí)現(xiàn)一個(gè)時(shí)間的進(jìn)度條,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- iOS實(shí)現(xiàn)步驟進(jìn)度條功能實(shí)例代碼
- 使用axios實(shí)現(xiàn)上傳圖片進(jìn)度條功能
- ios開(kāi)發(fā)加載webview顯示進(jìn)度條實(shí)例
- iOS 進(jìn)度條、加載、安裝動(dòng)畫(huà)的簡(jiǎn)單實(shí)現(xiàn)
- Android仿IOS ViewPager滑動(dòng)進(jìn)度條
- iOS實(shí)現(xiàn)帶動(dòng)畫(huà)的環(huán)形進(jìn)度條
- iOS快速實(shí)現(xiàn)環(huán)形漸變進(jìn)度條
- iOS中使用NSProgress類(lèi)來(lái)創(chuàng)建UI進(jìn)度條的方法詳解
- IOS實(shí)現(xiàn)簡(jiǎn)單的進(jìn)度條功能
- iOS中WKWebView仿微信加載進(jìn)度條
相關(guān)文章
通過(guò)UIKit坐標(biāo)系來(lái)全面掌握iOS中的UIScrollView組件
iOS開(kāi)發(fā)套件中的UIScrollView組件十分強(qiáng)大,不僅是滾動(dòng),縮放操作也能夠控制自如,其核心當(dāng)然是坐標(biāo)軸上的控制,下面就通過(guò)UIKit坐標(biāo)系來(lái)全面掌握iOS中的UIScrollView組件2016-05-05iOS實(shí)現(xiàn)通過(guò)按鈕添加和刪除控件的方法
這篇文章主要為大家詳細(xì)介紹了iOS通過(guò)按鈕添加和刪除控件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03談?wù)刬OS開(kāi)發(fā)之JSON格式數(shù)據(jù)的生成與解析
JSON格式取代了xml給網(wǎng)絡(luò)傳輸帶來(lái)了很大的便利,本篇文章主要介紹了iOS開(kāi)發(fā):對(duì)象直接轉(zhuǎn)化成JSON詳解,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01實(shí)例解析iOS應(yīng)用多線程開(kāi)發(fā)中NSthread類(lèi)的用法
這篇文章主要介紹了iOS應(yīng)用多線程開(kāi)發(fā)中NSthread類(lèi)的用法,代碼基于傳統(tǒng)的Objective-C,NSthread類(lèi)需要的朋友可以參考下2016-02-02iOS實(shí)現(xiàn)設(shè)備判斷是否安裝相關(guān)地圖(百度、高德等)
這篇文章主要給大家介紹了關(guān)于iOS如何實(shí)現(xiàn)設(shè)備判斷是否安裝相關(guān)地圖,比如百度、高德等,其實(shí)實(shí)現(xiàn)的方法還是很簡(jiǎn)單,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來(lái)一起看看吧。2018-01-01