博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[控件] CircleView
阅读量:7051 次
发布时间:2019-06-28

本文共 3811 字,大约阅读时间需要 12 分钟。

CircleView

效果图:

源码:

////  CircleView.h//  YXMWeather////  Created by XianMingYou on 15/2/17.//  Copyright (c) 2015年 XianMingYou. All rights reserved.//#import 
@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

 

转载地址:http://wgsol.baihongyu.com/

你可能感兴趣的文章
node.js 在window下安装
查看>>
CentOS 7打开文件中文乱码
查看>>
Winform动态创建控件对DPI的处理
查看>>
new关键字与malloc的区别
查看>>
《Just For Fun》阅读摘抄
查看>>
hibernate4.3.5.Final入门1
查看>>
python 发送邮件模块
查看>>
unqlite安装/使用/测试
查看>>
SQLite 查询或更新上一条插入的数据
查看>>
Ansible 之 roles使用
查看>>
我的友情链接
查看>>
OpenCV+Dlib进行实时脸部检测
查看>>
【Android】简单的日志工具
查看>>
8月初.wang域名总量TOP14:35互联耐思尼克竞争激烈
查看>>
解决wordpress上传文件2M限制
查看>>
读《学习正则表达式》(1)
查看>>
482. License Key Formatting - LeetCode
查看>>
AWK常用命令总结
查看>>
Webkit浏览器点击控件时出现的边框消除
查看>>
python Redis 手册 翻译
查看>>