iOS 下拉刷新動(dòng)畫(huà)的實(shí)現(xiàn)實(shí)例
先上完整的效果圖:
接下去動(dòng)畫(huà)分步實(shí)現(xiàn),首先先實(shí)現(xiàn)如下效果:
思路是這樣的,在偏移值小于等于100的時(shí)候繪制一個(gè)矩形,當(dāng)偏移值大于100的時(shí)候,底部直線變成曲線,主要是利用CAShapeLayer和UIBezierPath來(lái)實(shí)現(xiàn),代碼如下
#pragma mark - UIScrollViewDelegate -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat height = -scrollView.contentOffset.y; UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(0, 0)]; [path addLineToPoint:CGPointMake(self.view.width, 0)]; if (height <= 100) { //偏移值小于等于100的時(shí)候,底部繪制直線 [path addLineToPoint:CGPointMake(self.view.width, height)]; [path addLineToPoint:CGPointMake(0, height)]; }else{ //偏移值大于100的時(shí)候,底部繪制曲線 [path addLineToPoint:CGPointMake(self.view.width, 100)]; [path addQuadCurveToPoint:CGPointMake(0, 100) controlPoint:CGPointMake(self.view.center.x, height)]; } [path closePath]; self.shapeLayer.path = path.CGPath; }
其次,實(shí)現(xiàn)繪制太陽(yáng),效果如下:
主要用到的是CAShapeLayer的path和strokeEnd屬性,首先繪制一個(gè)太陽(yáng),代碼如下:
#pragma mark - private method -(void)p_initCircle { self.circleLayer.frame = CGRectMake(0, 0, self.view.width, 100); self.circleLayer.fillColor = nil; self.circleLayer.strokeColor = [UIColor whiteColor].CGColor; self.circleLayer.lineWidth = 2.0; CGPoint center = CGPointMake(self.view.center.x, 50); UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(self.view.center.x, 35)]; [path addArcWithCenter:center radius:15 startAngle:-M_PI_2 endAngle:M_PI * 1.5 clockwise:YES]; CGFloat r1 = 17.0; CGFloat r2 = 22.0; for (int i = 0; i < 8 ; i++) { CGPoint pointStart = CGPointMake(center.x + sin((M_PI * 2.0 / 8 * i)) * r1, center.y - cos((M_PI * 2.0 / 8 * i)) * r1); CGPoint pointEnd = CGPointMake(center.x + sin((M_PI * 2.0 / 8 * i)) * r2, center.y - cos((M_PI * 2.0 / 8 * i)) * r2); [path moveToPoint:pointStart]; [path addLineToPoint:pointEnd]; } self.circleLayer.path = path.CGPath; }
其次在拖拽的過(guò)程中,利用strokeEnd屬性逐步顯示太陽(yáng),代碼如下:
#pragma mark - UIScrollViewDelegate -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat height = -scrollView.contentOffset.y; if (height <= 100) { //偏移值小于等于100的時(shí)候,繪制對(duì)應(yīng)的路徑 self.circleLayer.strokeEnd = height / 100.0; }else{ //偏移值大于100的時(shí)候,繪制全路徑 self.circleLayer.strokeEnd = 1.0; } }
其次,讓繪制完的太陽(yáng)隨著拽動(dòng)而旋轉(zhuǎn),效果圖如下:
主要思想是在繪制完畢之后,通過(guò)affineTransform屬性,讓太陽(yáng)圖層旋轉(zhuǎn),代碼如下:
#pragma mark - UIScrollViewDelegate -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat height = -scrollView.contentOffset.y; [CATransaction begin]; [CATransaction setDisableActions:YES]; if (height <= 100) { //偏移值小于等于100的時(shí)候,不旋轉(zhuǎn) self.circleLayer.affineTransform = CGAffineTransformIdentity; }else{ //偏移值小于等于100的時(shí)候,旋轉(zhuǎn) self.circleLayer.affineTransform = CGAffineTransformMakeRotation(-(M_PI / 720 * height - 100)); } [CATransaction commit]; }
其中要注意的地方是需要禁止隱式動(dòng)畫(huà),不然每次修改affineTransform都會(huì)自動(dòng)帶上隱式動(dòng)畫(huà)效果。
最后就是釋放后,讓tableView滾動(dòng)到固定位置,然后讓太陽(yáng)持續(xù)旋轉(zhuǎn),屏蔽tableView的拖拽事件,主要用到的是CABaseAnimation,代碼如下
-(void)p_rise { self.tableView.scrollEnabled = NO; CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; anim.duration = 0.15; anim.toValue = @(M_PI / 4.0); anim.repeatCount = MAXFLOAT; [self.circleLayer addAnimation:anim forKey:nil]; }
最后在經(jīng)過(guò)一定時(shí)間后,移除圖層動(dòng)畫(huà),取消屏蔽tableView的拖拽事件,并且讓tableView滾動(dòng)到頂部,代碼如下:
-(void)p_stop { self.tableView.scrollEnabled = YES; [self.tableView setContentOffset:CGPointMake(0, 0) animated:YES]; [self.circleLayer removeAllAnimations]; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在uiview 的tableView中點(diǎn)擊cell進(jìn)入跳轉(zhuǎn)到另一個(gè)界面的實(shí)現(xiàn)方法
這篇文章主要介紹了在uiview 的tableView中點(diǎn)擊cell進(jìn)入跳轉(zhuǎn)到另一個(gè)界面的實(shí)現(xiàn)方法,首先重寫(xiě)uiviewcontrol方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10解決ios手機(jī)中input輸入框光標(biāo)過(guò)長(zhǎng)的問(wèn)題
在項(xiàng)目中做移動(dòng)端頁(yè)面,發(fā)現(xiàn)IOS 的光標(biāo)大小很大,和安卓的完全不一樣,怎么來(lái)調(diào)整大小呢?下面小編給大家?guī)?lái)了ios手機(jī)中input輸入框光標(biāo)過(guò)長(zhǎng)問(wèn)題的解決方法,一起看看吧2018-08-08iOS10添加本地推送(Local Notification)實(shí)例
這篇文章主要為大家詳細(xì)介紹了iOS10添加本地推送(Local Notification)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09ios開(kāi)發(fā)navigationController pushViewController 方式多次跳轉(zhuǎn)返回到最上層返回到
這篇文章主要介紹了ios開(kāi)發(fā)navigationController pushViewController 方式多次跳轉(zhuǎn)返回到最上層返回到指定的某一層的實(shí)現(xiàn)方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09iOS中實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪圖片功能實(shí)例
圖片處理中經(jīng)常用的圖片剪裁,就是通過(guò)剪裁框確定圖片剪裁的區(qū)域,然后剪去該區(qū)域的圖片,下面這篇文章主要給大家介紹了關(guān)于iOS中實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪圖片功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起看看吧。2017-11-11iOS使用UIScrollView實(shí)現(xiàn)無(wú)限循環(huán)輪播圖效果
這篇文章主要介紹了iOS使用UIScrollView實(shí)現(xiàn)無(wú)限循環(huán)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07IOS輕松幾步實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
這篇文章將講述幾個(gè)步驟實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的自定義方式,并且給出了示例代碼,畢竟代碼才是我們的語(yǔ)言,這樣比較容易上手。下面來(lái)一起看看吧。2016-09-09IOS UI學(xué)習(xí)教程之區(qū)分NSBundle和NSURL(讀取文件、寫(xiě)入文件)
這篇文章主要為大家詳細(xì)介紹了IOS UI學(xué)習(xí)教程之區(qū)分NSBundle和NSURL,如何讀取、寫(xiě)入文件,感興趣的小伙伴們可以參考一下2016-03-03