内部に単純なチャートをレンダリングするためのクラスが必要です (複雑なものはありません)。私の考えは/だった:
- サブクラス
UIView
--> それを呼び出しましょうGrapher
- その中にすべてのメソッドを実装します (
drawBarGraph
、drawProgressBar
、drawLineGraph
) - 目的のView Controllerに含め、のインスタンスを作成し
Grapher
、目的のメソッドを呼び出します - そのインスタンスをサブビューとしてメイン ビューに追加します。
これを説明する方法がわからないので、いくつかのコードに飛び込みましょう。は次のgrapher.h
とおりです。
@interface Grapher : UIView
{
CGContextRef context; //for passing it in via constructor
//UIColor *backgroundColor;
UIColor *graphColor; //foreground color
}
- (id)initWithFrame:(CGRect)frm inContext:(CGContextRef)ctx;
- (void)setGraphColor:(UIColor*)color;
- (void)drawHistogramWithItems:(NSArray*)items;
//- (void)drawLineChartWithItems:(NSArray*)items;
- (void)drawProgressLineWithPercentage:(float)percent;
そして対応するgrapher.m
:
@implementation Grapher
- (id)initWithFrame:(CGRect)frm inContext:(CGContextRef)ctx
{
self = [super initWithFrame:frm];
if (self)
{
context = ctx;
}
return self;
}
#pragma Mark main draw methods
- (void)drawHistogramWithItems:(NSArray *)items
{
//[backgroundColor set];
//UIRectFill(frame);
[graphColor set];
int itemWidth = 20;
if (items.count == 0) return;
float max = -1;
for (SFGraphItem *item in items)
if (item.value > max)
max = item.value;
float spacing = (frame.size.width - (itemWidth * items.count)) / (items.count + 1);
float xPos = spacing;
for (int i = 0; i < items.count; i++)
{
CGFloat itemHeight = ((SFGraphItem*)[items objectAtIndex:i]).value / max * frame.size.height;
CGRect bar = CGRectMake(xPos, frame.origin.y + frame.size.height - itemHeight, itemWidth, itemHeight);
CGContextAddRect(context, bar);
CGContextDrawPath(context, kCGPathFill);
xPos += spacing + itemWidth;
}
}
- (void)drawProgressLineWithPercentage:(float)percent
{
//[backgroundColor set];
//UIRectFill(frame);
[graphColor set];
UIRectFill(CGRectMake(frame.origin.x, frame.origin.y, frame.size.width / 100 * percent, frame.size.height));
}
#pragma Mark setters/getters
- (void)setGraphColor:(UIColor *)color
{
graphColor = color;
}
@end
素敵でシンプル。NSObject
それを別のファイルのthen サブクラスとしてサブクラス化しUIView
(それを と呼びましょう)、そこでGraphArea
オーバーライドし、その中に を渡すと、問題なく動作します。drawRect
alloc-init
Grapher
UIGraphicsGetCurrentContext()
しかし、私はこれに「中途半端な見方」はしたくありません。UIView
asをサブクラス化し、次のようにしたいGrapher
と思います。
Grapher *graph = [[Grapher alloc] initWithFrame:CGRectMake(5, 65, winSize.width - 10, 20)]; //some random frame
[graph setGraphColor:[UIColor redColor]];
[graph drawProgressLineWithPercentage:50];
graph.backgroundColor = [UIColor grayColor];
[someview addSubview:graph];
または this を使用してコンストラクターを呼び出し、CGContextRef
そこでコンテキストを取得しようとすると、常に null になります。現在のコンテキストで渡す方法は? 私は何が間違っていて、これを修正する方法はありますか?
説明が下手すぎる場合はお知らせください。もっと頑張ります。
乾杯、ジャン。