2

UIView で単純な円を描画しようとしています。QuartzCore でできることはわかっていますが、drawRect メソッドを使用したいと思います。

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, rect);
    CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor greenColor] CGColor]));
    CGContextFillPath(ctx);
}

を設定すると、上記のコードは機能しません[UIColor whiteColor][UIColor whiteColor]ビューが透明になると..

色が白の場合、ビューが透明になるのはなぜですか? 白い円を描くにはどうすればよいですか?

4

2 に答える 2

3

CGContextSetFillColor2番目のパラメーターについては、次の状態のドキュメント:

設定する色を表す強度値の配列。配列要素の数は、現在の塗りつぶし色空間の成分数に、アルファ値の追加成分を加えたものに等しくなければなりません。

greenColorは RGB 色空間からのものです。しかし、whiteColorそうではありません。そのため、 を使用するときに間違った数の色成分を渡すことになりますwhiteColor

はるかに簡単な解決策は、次のものを置き換えることです。

CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor greenColor] CGColor]));

と:

[[UIColor greenColor] set];

また:

[[UIColor whiteColor] set];

アップデート:

本当に Core Graphics が必要な場合の別のオプションは次のとおりです。

CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
于 2013-03-31T17:38:44.100 に答える
1

色空間の不一致が原因で問題が発生しています。描画しているコンテキストには、デフォルトで RBGA 色空間があり、4 つのコンポーネント (赤、青、緑、アルファ) の入力が必要です。しかし、[UIColor whiteColor] で UIColor を作成すると、この色はグレースケール カラー スペースで作成され、2 つのコンポーネント (白、アルファ) しか得られません。したがって、あるカラー スペースの値を別のカラー スペースに挿入すると、予期しない結果が生じます。

したがって、CGContextSetFillColorSpace() を使用してコンテキストの色空間をグレースケールの色空間に変更する必要があります...

または、より簡単なメソッド CGContextSetFillColorWithColor() を使用することもできます。このメソッドは、任意の色空間の CGColor を取り込み、CGColor の色空間に関係なくコンテキストに適用します。

- (void) drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, rect);
    CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
    CGContextFillPath(ctx);
}
于 2013-03-31T17:47:14.037 に答える