文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

iOS实现圆环比例图

2022-05-16 16:50

关注

本文实例为大家分享了iOS实现圆环比例图的具体代码,供大家参考,具体内容如下

实现效果

实现方法

SSTCircleProgressView 


@interface SSTCircleProgressView : UIView 

@property (nonatomic,copy) CAShapeLayerLineCap lineCap;
 

@property (nonatomic,copy) NSString *progressLabelText;
 

@property (nonatomic,copy) UIColor *progressLabelTextColor;
 

@property (nonatomic,assign) CGFloat progressLineWidth;

@property (nonatomic,assign) CGFloat backgroundLineWidth;

@property (nonatomic,assign) CGFloat percentage;

@property (nonatomic,strong) UIColor *backgroundStrokeColor;

@property (nonatomic,strong) UIColor *progressStrokeColor;

@property (nonatomic,assign) CGFloat offset;
 
- (void)setProgress:(CGFloat)percentage animated:(BOOL)animated;
 
@end

#import "SSTCircleProgressView.h"
 
#define kDuration 1.0
#define kDefaultLineWidth 10
 
@interface SSTCircleProgressView()
 
@property (nonatomic,strong) CAShapeLayer *backgroundLayer;
@property (nonatomic,strong) CAShapeLayer *progressLayer;
@property (nonatomic,strong) UILabel *progressLabel;
@property (nonatomic,strong) NSTimer *timer;
@property (nonatomic,assign) CGFloat startAngle ; // M_PI*2
@property (nonatomic,assign) CGFloat endAngle ;
 
@end
 
@implementation SSTCircleProgressView
 
- (instancetype)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    [self setBackgroundColor:[UIColor clearColor]];
    [self createSubViews];
    //init default variable
    self.backgroundLineWidth = kDefaultLineWidth;
    self.progressLineWidth = kDefaultLineWidth;
    self.percentage = 0;
    self.offset = 0;
    self.startAngle = -M_PI_2;
    self.endAngle = 0;
  }
  return self;
}
 
- (void)createSubViews
{
  //self.progressLabel.text = @"0%";
  self.progressLabel.textAlignment = NSTextAlignmentCenter;
  self.progressLabel.font = FONTBOLD(12);
  [self addSubview:self.progressLabel];
  
  _backgroundLayer = [CAShapeLayer layer];
  _backgroundLayer.frame = self.bounds;
  _backgroundLayer.fillColor = nil;
  _backgroundLayer.strokeColor = [UIColor lightGrayColor].CGColor;
  
  _progressLayer = [CAShapeLayer layer];
  _progressLayer.frame = self.bounds;
  _progressLayer.fillColor = nil;
  _progressLayer.strokeColor = [UIColor redColor].CGColor;
  
  [self.layer addSublayer:_backgroundLayer];
  [self.layer addSublayer:_progressLayer];
}
 
-(void)setProgressLabelText:(NSString *)progressLabelText{
  _progressLabelText = progressLabelText;
  self.progressLabel.text = progressLabelText;
}
 
-(void)setProgressLabelTextColor:(UIColor *)progressLabelTextColor{
  _progressLabelTextColor = progressLabelTextColor;
  self.progressLabel.textColor = progressLabelTextColor;
}
 
 
#pragma mark - Draw CircleLine
- (void)setBackgroundCircleLine
{
  UIBezierPath *path = [UIBezierPath bezierPath];
  path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x - self.frame.origin.x, self.center.y - self.frame.origin.y)
                     radius:(self.frame.size.width - _backgroundLineWidth)/2 - _offset
                   startAngle:self.startAngle
                    endAngle:self.endAngle
                    clockwise:NO];
  _backgroundLayer.path = path.CGPath;
}
 
- (void)setProgressCircleLine
{
  UIBezierPath *path = [UIBezierPath bezierPath];
  path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x - self.frame.origin.x, self.center.y - self.frame.origin.y)
                     radius:(self.frame.size.width - _progressLineWidth)/2 - _offset
                   startAngle:self.startAngle
                    endAngle:self.endAngle
                    clockwise:NO];
  _progressLayer.path = path.CGPath;
}
 
#pragma mark - Lazy Load
- (UILabel *)progressLabel
{
  if (!_progressLabel) {
    _progressLabel = [[UILabel alloc]initWithFrame:CGRectMake((self.bounds.size.width -100)/2, (self.bounds.size.height - 100)/2, 100, 100)];
  }
  return _progressLabel;
}
 
- (void)setBackgroundLineWidth:(CGFloat)backgroundLineWidth
{
  _backgroundLineWidth = backgroundLineWidth;
  _backgroundLayer.lineWidth = _backgroundLineWidth;
  [self setBackgroundCircleLine];
}
 
-(void)setLineCap:(CAShapeLayerLineCap)lineCap{
  _progressLayer.lineCap = lineCap;
  [self setProgressCircleLine];
}
 
- (void)setProgressLineWidth:(CGFloat)progressLineWidth
{
  _progressLineWidth = progressLineWidth;
  _progressLayer.lineWidth = _progressLineWidth;
  [self setProgressCircleLine];
}
 
- (void)setPercentage:(CGFloat)percentage {
  _percentage = percentage;
}
 
- (void)setBackgroundStrokeColor:(UIColor *)backgroundStrokeColor {
  _backgroundStrokeColor = backgroundStrokeColor;
  _backgroundLayer.strokeColor = _backgroundStrokeColor.CGColor;
}
 
- (void)setProgressStrokeColor:(UIColor *)progressStrokeColor
{
  _progressStrokeColor = progressStrokeColor;
  _progressLayer.strokeColor = _progressStrokeColor.CGColor;
}
 
#pragma mark - progress animated YES or NO
- (void)setProgress:(CGFloat)percentage animated:(BOOL)animated
{
  self.percentage = percentage;
  _progressLayer.strokeEnd = _percentage;
  if (animated) {
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    animation.fromValue = [NSNumber numberWithFloat:0.0];
    animation.toValue = [NSNumber numberWithFloat:_percentage];
    animation.duration = kDuration;
    [_progressLayer addAnimation:animation forKey:@"strokeEndAnimation"];
  }else{
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    _progressLabel.text = [NSString stringWithFormat:@"%.0f%%",_percentage*100];
    [CATransaction commit];
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯