如何使用Core Graphics绘制进度视图

时间:2013-08-30 12:08:15

标签: ios core-graphics quartz-2d

我想创建一个自定义进度视图,该视图在用户按下按钮时进行,在按钮释放时停止。 空白子视图表示进度的背景,并且我绘制了一个作为起点的正方形。 空白视图应该被填满,直到按钮被释放。如何在按钮被释放之前一直填充视图?

这是我的代码:

CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);


CGRect square=CGRectMake(0, 0, 5, 9);
CGContextAddRect(context, square);
CGContextStrokePath(context);

CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);


CGContextFillRect(context, square);

在视图控制器的ViewDidLoad

    SeekBar *seek=[[SeekBar alloc]initWithFrame:CGRectMake(0, 320, 320, 9)];
    [self.view addSubview:seek];

我是核心图形的新手。这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

好的,这里有一些代码可以像你提到的那样不断进步。您真正想要做的是根据进度调整填充的宽度。请查看drawRect:方法。

此外,您希望将SeekBar挂钩到一个按钮,当某人触及进度增加/开始时,当他们松开按钮时,进度停止。 awakeFromNib:中的方法调用应该指导您。

如果您仍然对此代码感到困惑,我可以发布示例项目,以便您可以构建并观察整个协同工作。

SeekBar.h

#import <UIKit/UIKit.h>

@interface SeekBar : UIView
@property (nonatomic, strong) IBOutlet UIButton *button;
@end

SeekBar.m

#import "SeekBar.h"

@interface SeekBar()
@property (nonatomic) float progress;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, strong) UILabel *completeLabel;
@end

@implementation SeekBar

- (void)awakeFromNib {
    [self.button addTarget:self action:@selector(startProgress) forControlEvents:UIControlEventTouchDown];
    [self.button addTarget:self action:@selector(stopProgress) forControlEvents:UIControlEventTouchUpInside];
}

- (void)startProgress {
    if (![self.subviews containsObject:self.completeLabel]) {
        [self addSubview:self.completeLabel];
    }
    self.progress = 0.0;
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(incrementProgress) userInfo:nil repeats:YES];
}

- (void)incrementProgress {
    if (self.progress <= 1.0) {
        self.progress += 0.001;
        [self setNeedsDisplay];
        self.completeLabel.text = @"Loading...";
    } else {
        self.completeLabel.text = @"Complete";
    }
}

- (UILabel *)completeLabel {
    if (!_completeLabel) {
        _completeLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, self.frame.size.width-10, self.frame.size.height)];
        _completeLabel.backgroundColor = [UIColor clearColor];
        _completeLabel.textColor = [UIColor whiteColor];
    }
    return _completeLabel;
}

- (void)stopProgress {
    [self.timer invalidate];
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
    UIRectFill(CGRectMake(0, 0, rect.size.width * self.progress, rect.size.height));
}

@end