网易新闻客户端下拉刷新动画的实现

最近闲来无事,来说说一些简单优秀的控件以及实现,网易新闻客户端的下拉刷新大家都应该知道:随着下拉的距离去画一个红色的圆,到达一定的距离后松手,圆圈转动,表示正在刷新,为什么这个圆有一个小缺口呢?如果是一个完整的圆,那还看得到转动的效果吗?下面来说说他的实现吧。

看到这样的一个交互,应该会很容易的想到两件事,第一:这是一个下拉刷新控件(废话);第二:需要动态去画一个圆。别急,步子迈大了,容易扯到蛋。

先看第一件事:下拉刷新,这个东东应该不用多说,有很多封装得很好的控件,我们就从ego下手,ego的视图上有4部分内容,1:向上、向下的箭头,2:表示状态的文字,3:刷新时间,4:转动的菊花(箭头消失,正在刷新时出现),这就简单了,我们只需要把箭头和转动的菊花换成我们自己的圆就OK了。

再看第二件事:动态的画一个圆,先简单一点:就画一个圆。

涉及到绘画,要用到core graphics库里面的东东,在UIView的子类中,在

- (void)drawRect:(CGRect)rect;方法里开始我们的画图,就像现实生活中画画一样,首先要有一块画布,然后画笔,颜料等等,这些东西准备好了就可以画图了。

建一个类MyView继承与UIView,把默认注释掉的drawRect方法打开,开始“画”吧!

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    // 第一步
    CGContextRef context = UIGraphicsGetCurrentContext();
    // 第二部
    CGContextSetLineWidth(context, 5.0f);
    CGContextSetLineCap(context, kCGLineCapButt);
    CGContextSetStrokeColorWithColor(context, [[UIColor redColor]CGColor]);
    //我们将一个圆360°,12等分,每份30°
    CGFloat perAngle = 2*M_PI/12;
    //设置开始角度
    CGFloat startAngle = -perAngle;
    CGFloat step = 11*perAngle;
    //设置要画的形状
    CGContextAddArc(context, self.bounds.size.width/2, self.bounds.size.height/2, self.bounds.size.width/2-3, startAngle, startAngle+step, 0);
    // 第三步
    CGContextStrokePath(context);
}

第一步:取得当前上下文,即“画布”;

第二步:设置线宽、线头、颜色、和要画的形状(圆弧);

第三步:画吧。

在viewDidLoad方法里面添加一个MyView对象,运行:

网易新闻客户端下拉刷新动画的实现_第1张图片


如何动态的画图呢?上面图中有一个滑块,你没看错,在MyView.h中加一个属性

 
  
@interface MyView : UIView
@property (assign, nonatomic) float progress;
@end

修改
- (void)drawRect:(CGRect)rect中的这句代码:

CGFloat step = 11*perAngle*_progress;

在viewDidLoad里设置要slider,最大值为1,最小值为0,在事件触发方法里设置:

_myView.progress = slider.value;

开始滑动吧,少年!这下事情就简单了,在ego里面添加一个MyView对象,用向下滑动的距离来设置MyView对象的progress属性,就会得到动态画圆的效果了!怎么让这个圆弧转动呢?同样很简单:

CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath: @"transform.rotation.z"];
rotate.fromValue = @0;
rotate.toValue = @(M_PI*2);
rotate.repeatCount = INFINITY;
rotate.removedOnCompletion = FALSE;
rotate.fillMode = kCAFillModeForwards;
rotate.duration = 1.0;
[_myView.layer addAnimation:rotate forKey:@"rotateAnimation"];


 
  

把上面这段代码添加到ego里面设置状态方法中正在刷新分支里面即可。

网易新闻客户端下拉刷新动画的实现_第2张图片

 
  
 
  
 
  

你可能感兴趣的:(iOS那些事)