1

内部に単純なチャートをレンダリングするためのクラスが必要です (複雑なものはありません)。私の考えは/だった:

  • サブクラスUIView--> それを呼び出しましょうGrapher
  • その中にすべてのメソッドを実装します ( drawBarGraphdrawProgressBardrawLineGraph)
  • 目的の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オーバーライドし、その中に を渡すと、問題なく動作します。drawRectalloc-initGrapherUIGraphicsGetCurrentContext()

しかし、私はこれに「中途半端な見方」はしたくありません。UIViewasをサブクラス化し、次のようにしたい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 になります。現在のコンテキストで渡す方法は? 私は何が間違っていて、これを修正する方法はありますか?
説明が下手すぎる場合はお知らせください。もっと頑張ります。

乾杯、ジャン。

4

1 に答える 1