用CALayer实现下载进度条
效果:
源码:
//
// ViewController.m
// ProgressView
//
// Created by YouXianMing on 14/11/18.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, strong) CALayer *layer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
// CALayer
_layer = [CALayer layer];
_layer.frame = CGRectMake(50, 50, 200, 2);
_layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:_layer];
// 定时器
_timer = [NSTimer scheduledTimerWithTimeInterval:1.f
target:self
selector:@selector(timerEvent)
userInfo:nil
repeats:YES];
}
/**
* 定时器
*/
- (void)timerEvent {
// 显式动画
_layer.frame = CGRectMake(50, 50, arc4random()%200, 2);
}
@end
封装后的源码:
//
// ProgressView.h
// ProgressView
//
// Created by YouXianMing on 14/11/18.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ProgressView : UIView
@property (nonatomic, strong) UIColor *progressColor;
@property (nonatomic, assign) CGFloat progress;
@end
//
// ProgressView.m
// ProgressView
//
// Created by YouXianMing on 14/11/18.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "ProgressView.h"
@interface ProgressView ()
{
CALayer *_backLayer;
CGFloat _frameWidth;
CGFloat _layerWidth;
}
@end
@implementation ProgressView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_backLayer = [CALayer layer];
_frameWidth = self.bounds.size.width;
_layerWidth = 0;
_backLayer.frame = CGRectMake(0, 0, _layerWidth, frame.size.height);
[self.layer addSublayer:_backLayer];
}
return self;
}
@synthesize progressColor = _progressColor;
- (void)setProgressColor:(UIColor *)progressColor {
_progressColor = progressColor;
_backLayer.backgroundColor = _progressColor.CGColor;
}
- (UIColor *)progressColor {
return _progressColor;
}
@synthesize progress = _progress;
- (void)setProgress:(CGFloat)progress {
_progress = progress;
CGRect rect = _backLayer.frame;
if (_progress <= 0) {
rect.size.width = 0;
} else if (_progress >= 1) {
rect.size.width = _frameWidth;
} else {
rect.size.width = _progress * _frameWidth;
}
_backLayer.frame = rect;
}
- (CGFloat)progress {
return _progress;
}
@end
时间: 2024-12-21 10:43:36