CircleView
效果图:
源码:
//
// CircleView.h
// YXMWeather
//
// Created by XianMingYou on 15/2/17.
// Copyright (c) 2015年 XianMingYou. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface CircleView : UIView
/**
* 线条宽度
*/
@property (nonatomic) CGFloat lineWidth;
/**
* 线条颜色
*/
@property (nonatomic, strong) UIColor *lineColor;
/**
* 旋转方向
*/
@property (nonatomic) BOOL clockWise;
/**
* 开始角度
*/
@property (nonatomic) CGFloat startAngle;
/**
* 初始化view
*/
- (void)buildView;
/**
* 做stroke动画
*
* @param value 取值 [0, 1]
* @param animated 时候执行动画
*/
- (void)strokeEnd:(CGFloat)value animated:(BOOL)animated duration:(CGFloat)duration;
@end
//
// CircleView.m
// YXMWeather
//
// Created by XianMingYou on 15/2/17.
// Copyright (c) 2015年 XianMingYou. All rights reserved.
//
#import "CircleView.h"
// 将度数转换为弧度
#define RADIAN(degrees) ((M_PI * (degrees))/ 180.f)
// 将弧度转换为度数
#define DEGREES(radian) ((radian) * 180.f / M_PI)
@interface CircleView ()
@property (nonatomic, strong) CAShapeLayer *circleLayer; // 圆形layer
@end
@implementation CircleView
/**
* 初始化frame值
*
* @param frame 尺寸值
*
* @return 实例对象
*/
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// 创建出layer
[self createCircleLayer];
}
return self;
}
/**
* 创建出layer
*/
- (void)createCircleLayer {
self.circleLayer = [CAShapeLayer layer];
self.circleLayer.frame = self.bounds;
[self.layer addSublayer:self.circleLayer];
}
/**
* 初始化view
*/
- (void)buildView {
// 初始化信息
CGFloat lineWidth = (self.lineWidth <= 0 ? 1 : self.lineWidth);
UIColor *lineColor = (self.lineColor == nil ? [UIColor blackColor] : self.lineColor);
CGSize size = self.bounds.size;
CGFloat radius = size.width / 2.f - lineWidth / 2.f; // 设置半径(刚好贴到frame上面去)
// 旋转方向
BOOL clockWise = self.clockWise;
CGFloat startAngle = 0;
CGFloat endAngle = 0;
if (clockWise == YES) {
startAngle = -RADIAN(180 - self.startAngle);
endAngle = RADIAN(180 + self.startAngle);
} else {
startAngle = RADIAN(180 - self.startAngle);
endAngle = -RADIAN(180 + self.startAngle);
}
// 创建出贝塞尔曲线
UIBezierPath *circlePath \
= [UIBezierPath bezierPathWithArcCenter:CGPointMake(size.height / 2.f, size.width / 2.f)
radius:radius
startAngle:startAngle
endAngle:endAngle
clockwise:clockWise];
// 获取path
self.circleLayer.path = circlePath.CGPath;
// 设置颜色
self.circleLayer.strokeColor = lineColor.CGColor;
self.circleLayer.fillColor = [[UIColor clearColor] CGColor];
self.circleLayer.lineWidth = lineWidth;
self.circleLayer.strokeEnd = 0.f;
}
/**
* 做stroke动画
*
* @param value 取值 [0, 1]
* @param animated 时候执行动画
*/
- (void)strokeEnd:(CGFloat)value animated:(BOOL)animated duration:(CGFloat)duration {
// 过滤掉不合理的值
if (value <= 0) {
value = 0;
} else if (value >= 1) {
value = 1.f;
}
if (animated) {
// 关键帧动画
CABasicAnimation *basicAnimation = [CABasicAnimation animation];
basicAnimation.keyPath = @"strokeEnd";
basicAnimation.duration = duration;
basicAnimation.timingFunction = \
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
basicAnimation.fromValue = @(self.circleLayer.strokeEnd);
basicAnimation.toValue = @(value);
// 执行动画
self.circleLayer.strokeEnd = value;
[self.circleLayer addAnimation:basicAnimation forKey:nil];
} else {
// 关闭动画
[CATransaction setDisableActions:YES];
self.circleLayer.strokeEnd = value;
}
}
@end