我想创建一个自定义进度视图,该视图在用户按下按钮时进行,在按钮释放时停止。 空白子视图表示进度的背景,并且我绘制了一个作为起点的正方形。 空白视图应该被填满,直到按钮被释放。如何在按钮被释放之前一直填充视图?
这是我的代码:
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];
我是核心图形的新手。这是正确的方法吗?
答案 0 :(得分:0)
好的,这里有一些代码可以像你提到的那样不断进步。您真正想要做的是根据进度调整填充的宽度。请查看drawRect:
方法。
此外,您希望将SeekBar挂钩到一个按钮,当某人触及进度增加/开始时,当他们松开按钮时,进度停止。 awakeFromNib:
中的方法调用应该指导您。
如果您仍然对此代码感到困惑,我可以发布示例项目,以便您可以构建并观察整个协同工作。
#import <UIKit/UIKit.h>
@interface SeekBar : UIView
@property (nonatomic, strong) IBOutlet UIButton *button;
@end
#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