码迷,mamicode.com
首页 > 其他好文 > 详细

自定义进度条

时间:2015-12-31 19:20:46      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

用 CAShapeLayer 可以根据传入的的贝塞尔曲线UIBezierPath *path , 创建出需要的进度条形状。然后只要 实时的设置CAShapeLayer的strokeEnd属性,就可以更新进度条的进度。

部分代码:

/** 进度条 和 背景 */
- (CAShapeLayer *)createLayer:(UIColor *)strokeColor path:(UIBezierPath *)path {
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.lineWidth = 5;
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.strokeColor = strokeColor.CGColor;
    layer.path= path.CGPath;
    [self.layer addSublayer:layer];
    return layer;
}

/** 设置进度 描边停止 */
- (void)setProgress:(CGFloat)progress {
    _progress = progress;
    
    self.progressLabel.text = [NSString stringWithFormat:@"%.0f%%",progress *100];
    self.progressLayer.strokeEnd = _progress;
}

/** 创建贝塞尔曲线 */
- (UIBezierPath *)createPathWith:(CGRect)frame {
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    switch (self.style) {
        case CusProgressViewStyleNone:{
            path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(frame.size.width / 2.0, frame.size.height / 2.0) radius:CGRectGetWidth(frame)/ 2.0 startAngle:-M_PI_2 endAngle:M_PI_2 * 3 clockwise:YES];
        }
            break;
        case CusProgressViewStyleRectSegment: {
            CGFloat minAngle = 2 * M_PI / self.gridCount;
            for (int i = 0; i < self.gridCount; i++) {
                
                CGFloat startAngle = i * minAngle;
                CGFloat endAngle = (i+ 2/3.0) * minAngle;
                
                UIBezierPath *path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(frame.size.width / 2.0, frame.size.height / 2.0) radius:CGRectGetWidth(frame)/ 2.0 startAngle:-M_PI_2 + startAngle endAngle:-M_PI_2 + endAngle clockwise:YES];
                [path appendPath:path1];
            }
        }
            break;
        case CusProgressViewStyleRoundSegment: {
            self.backgroundLayer.lineCap = kCALineCapRound;
            self.backgroundLayer.lineJoin = kCALineJoinRound;
            self.progressLayer.lineCap = kCALineCapRound;
            self.progressLayer.lineJoin = kCALineJoinRound;
            
            static CGFloat minAngle = 1;
            for (int i = 0; i < ceil(360 / (minAngle + self.gridInterval)); i++) {
                
                CGFloat startAngle = i * (minAngle+self.gridInterval) * M_PI / 180.0;
                CGFloat endAngle = startAngle + minAngle * M_PI / 180.0;
                if (endAngle >= 2 * M_PI) {
                    endAngle = 2 * M_PI;
                }
                
                UIBezierPath *path2 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(frame.size.width / 2.0, frame.size.height / 2.0) radius:CGRectGetWidth(frame)/ 2.0 startAngle:-M_PI_2 + startAngle endAngle:-M_PI_2 + endAngle clockwise:YES];
                [path appendPath:path2];
            }
        }
            break;
        default:
            break;
    }
    
    return path;
}

 

技术分享

练习代码:http://pan.baidu.com/s/1mhxGEuc

自定义进度条

标签:

原文地址:http://www.cnblogs.com/CyanStone/p/5092508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!