国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS 下拉刷新動畫的實現(xiàn)實例

2019-10-21 18:46:17
字體:
來源:轉載
供稿:網友

先上完整的效果圖:

ios,下拉刷新動畫,ios下拉刷新動畫效果,下拉刷新實現(xiàn)

接下去動畫分步實現(xiàn),首先先實現(xiàn)如下效果:

ios,下拉刷新動畫,ios下拉刷新動畫效果,下拉刷新實現(xiàn)

思路是這樣的,在偏移值小于等于100的時候繪制一個矩形,當偏移值大于100的時候,底部直線變成曲線,主要是利用CAShapeLayer和UIBezierPath來實現(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的時候,底部繪制直線    [path addLineToPoint:CGPointMake(self.view.width, height)];    [path addLineToPoint:CGPointMake(0, height)];  }else{    //偏移值大于100的時候,底部繪制曲線    [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;}

其次,實現(xiàn)繪制太陽,效果如下:

ios,下拉刷新動畫,ios下拉刷新動畫效果,下拉刷新實現(xiàn)

主要用到的是CAShapeLayer的path和strokeEnd屬性,首先繪制一個太陽,代碼如下:

#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;}

其次在拖拽的過程中,利用strokeEnd屬性逐步顯示太陽,代碼如下:

#pragma mark - UIScrollViewDelegate-(void)scrollViewDidScroll:(UIScrollView *)scrollView {  CGFloat height = -scrollView.contentOffset.y;  if (height <= 100) {    //偏移值小于等于100的時候,繪制對應的路徑    self.circleLayer.strokeEnd = height / 100.0;  }else{    //偏移值大于100的時候,繪制全路徑    self.circleLayer.strokeEnd = 1.0;  }}

其次,讓繪制完的太陽隨著拽動而旋轉,效果圖如下:

ios,下拉刷新動畫,ios下拉刷新動畫效果,下拉刷新實現(xiàn)

主要思想是在繪制完畢之后,通過affineTransform屬性,讓太陽圖層旋轉,代碼如下:

#pragma mark - UIScrollViewDelegate-(void)scrollViewDidScroll:(UIScrollView *)scrollView {  CGFloat height = -scrollView.contentOffset.y;  [CATransaction begin];  [CATransaction setDisableActions:YES];  if (height <= 100) {    //偏移值小于等于100的時候,不旋轉    self.circleLayer.affineTransform = CGAffineTransformIdentity;  }else{    //偏移值小于等于100的時候,旋轉    self.circleLayer.affineTransform = CGAffineTransformMakeRotation(-(M_PI / 720 * height - 100));  }  [CATransaction commit];}

其中要注意的地方是需要禁止隱式動畫,不然每次修改affineTransform都會自動帶上隱式動畫效果。

最后就是釋放后,讓tableView滾動到固定位置,然后讓太陽持續(xù)旋轉,屏蔽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];}

最后在經過一定時間后,移除圖層動畫,取消屏蔽tableView的拖拽事件,并且讓tableView滾動到頂部,代碼如下:

-(void)p_stop {  self.tableView.scrollEnabled = YES;  [self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];  [self.circleLayer removeAllAnimations];}

源代碼傳送門

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南华县| 乌鲁木齐市| 蛟河市| 黔江区| 东山县| 香港 | 固镇县| 紫金县| 寿光市| 瑞昌市| 华蓥市| 凌海市| 墨竹工卡县| 信宜市| 綦江县| 武汉市| 和静县| 科技| 蓬莱市| 镇赉县| 房产| 眉山市| 扶余县| 城固县| 南康市| 股票| 金湖县| 巴青县| 友谊县| 儋州市| 阿拉尔市| 始兴县| 定安县| 南涧| 库车县| 六枝特区| 华安县| 会理县| 全南县| 汉川市| 宁夏|