最近闲来无事,来说说一些简单优秀的控件以及实现,网易新闻客户端的下拉刷新大家都应该知道:随着下拉的距离去画一个红色的圆,到达一定的距离后松手,圆圈转动,表示正在刷新,为什么这个圆有一个小缺口呢?如果是一个完整的圆,那还看得到转动的效果吗?下面来说说他的实现吧。
看到这样的一个交互,应该会很容易的想到两件事,第一:这是一个下拉刷新控件(废话);第二:需要动态去画一个圆。别急,步子迈大了,容易扯到蛋。
先看第一件事:下拉刷新,这个东东应该不用多说,有很多封装得很好的控件,我们就从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对象,运行:
如何动态的画图呢?上面图中有一个滑块,你没看错,在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里面设置状态方法中正在刷新分支里面即可。