3

iOS の UIView で四角形を描画している間、同じ問題が発生し続けます。四角形の余白が背景と色をブレンドします。ベジェ パスを使用し、1 行ずつ描画し、余白を描画し、四角形の内部を塗りつぶして、いくつかの四角形の描画方法を試しましたが、結果は同じでした。

ビューのフレーム自体は常に正しく描画されます。四角形が必要なときはいつでもビューを使用することを検討しましたが、それらの多くを描画する必要があるため、特別なことを行う正しい方法とは思えません。

これが私の問題の例です。比較のために、同じ寸法の長方形の緑色のビューを描いています。

CGRect horizontalBar = CGRectMake(2, 2, 10, 6);

UIView* horizontalBarSubView = [[UIView alloc] initWithFrame:horizontalBar];
horizontalBarSubView.backgroundColor = [UIColor greenColor];
[self addSubview:horizontalBarSubView];
[horizontalBarSubView release];

そして長方形自体について:

CGRect horizontalBar = CGRectMake(2, 20, 10, 6);

UIBezierPath* horizontalBarPath = [UIBezierPath bezierPathWithRect:horizontalBar];
[[UIColor greenColor] set];
[horizontalBarPath fill];

これにより、次の結果が得られます (10 倍ズーム)。

10倍ズーム長方形テスト

色が混ざる原因は何ですか?

どうすればこれを回避できますか?

4

2 に答える 2

2

CGContext をいじってみましたか?

CGContextSetShouldAntialias

ここでグラフィックコンテキスト設定を見てください:

http://www.apeth.com/iOSBook/ch15.html

「グラフィックス コンテキストで描画すると、描画はコンテキストの現在の設定に従います。したがって、手順は常に、最初にコンテキストの設定を構成してから描画します。」

CGContextSetShouldAntialias フラグが設定されていないコンテキストが必要です。

コメントに記載されているように、これにより、そうでなければ長方形の色とブレンドされるピクセルが塗りつぶされます。

于 2012-01-31T15:35:01.133 に答える
2

@Almo は、問題がアンチエイリアシングであることは正しいですが、これが実際のコードと値であると確信していますか? これはアンチエイリアスであってはならず、私のテストではそうではないことが示されています。結果を得るには、パスを次のように変更する必要があります。

CGRect horizontalBar = CGRectMake(2.5, 20.5, 10, 6);

小数ピクセルのパスを塗りつぶすと、見ている効果が得られます。また、幅が奇数のインテグラル ピクセルのパスをストロークすると、この方法でアンチエイリアスが適用されます。(すべて非 Retina ディスプレイ上。Retina は若干異なります。)

@Almoが提案するように、アンチエイリアスをオフにすることは一般的にお勧めしません。代わりに、パスがピクセル全体を描画または塗りつぶしていることを確認する必要があります。

これについては、 iOS 5 Programming Pushing the Limitsの第 6 章、114 ページで詳しく説明しています。

于 2012-01-31T16:04:09.283 に答える