我正在研究UIView的子类。在这个视图中,我需要UIGraphicsGetCurrentContext。我绘制了一个水平条,它工作得非常好。现在在同一视图中,如果用户在任何地方触摸,我需要创建另一个水平条而不删除前一个条。
我该怎么做?因为当我尝试做某事时它会删除前一个条形图然后画第二个条形图但我需要两个条形图。
这是代码:
//set frame for bar
CGRect frameDays;
frameDays.origin.x = prevDayWidth;
frameDays.origin.y = heightBar;
frameDays.size.height = heightOfBar;
frameDays.size.width = distanceBetweenDays;
UIColor* color = [monthColorArray objectAtIndex:i%12];
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextSetLineWidth(context, lineWidth);
CGContextSetStrokeColorWithColor(context, borderColor.CGColor);
CGContextFillRect(context, frameDays);
CGContextStrokeRect(context, frameDays);
我只是换一个画框来画第二个小节。请帮帮我。
答案 0 :(得分:1)
实施drawRect
时,每次调用setNeedsDisplay
时都会清除上下文。因此,您必须在一次drawRect
调用中绘制所有条形图。以下是如何实现这一目标的示例:
假设您的视图绘制条充当透明叠加层,在其他UI视图之上,并且仅绘制条形图。
为此视图定义datasource
,然后在drawRect:
中使用此数据源,如下所示:
在.h
@protocol BarOverlayDatasource <NSObject>
- (NSUInteger)numberOfBars;
- (CGRect)barFrameForIndex:(NSUInteger)index;
- (UIColor *)barColorForIndex:(NSUInteger)index;
@end
@interface BarsOverlayView : UIView
@property (nonatomic, weak) id<BarOverlayDatasource> datasource;
@end
在.m
@implementation BarsOverlayView
#define NEMarkedViewCrossSize 7
- (void)drawRect:(CGRect)rect
{
if (self.datasource) {
CGContextRef context = UIGraphicsGetCurrentContext();
//drawing settings
UIColor* barColor = nil;
CGRect barFrame = CGrectZero;
CGContextSetLineWidth(context, lineWidth);
CGContextSetStrokeColorWithColor(context, borderColor.CGColor);
NSUInteger barCount = [self.datasource numberOfBars];
//repeat drawing for each 'bar'
for (NSUInteger i =0; i < barCount; i++) {
//retrieve data defining bar position,
// I chose CGRect for the example, but maybe a single CGPoint would be
//enough to computer each barFrame
barFrame = [self.datasource barFrameForIndex:i];
barColor = [self.datasource barColorForIndex:i]
CGContextSetFillColorWithColor(context, barColor.CGColor);
CGContextFillRect(context, barFrame);
CGContextStrokeRect(context, barFrame);
}
}
}
@end