2

Core Graphics で問題が発生しています。2 つの図形が一緒に収まるはずですが、それらの辺が斜めになっていると、それらの間に継ぎ目が表示されます。これが問題を引き起こしています。形状を重ねることでこれを「修正」できます。これは単純なものには機能しますが、形状がより複雑になると、うまくいきません。

簡単な例を次に示します。

[[UIColor blackColor] setFill];
[path fill]; //fills the entire background black

UIBezierPath *path1 = [UIBezierPath bezierPath];
[path1 moveToPoint:CGPointMake(0.0f, 0.0f)];
[path1 addLineToPoint:CGPointMake(100, 0.0f)];
[path1 addLineToPoint:CGPointMake(50, rect.size.height)];
[path1 addLineToPoint:CGPointMake(0, rect.size.height)];
[path1 closePath];
UIBezierPath *path2 = [UIBezierPath bezierPath];
[path2 moveToPoint:CGPointMake(100, 0)];
[path2 addLineToPoint:CGPointMake(rect.size.width, 0)];
[path2 addLineToPoint:CGPointMake(rect.size.width, rect.size.height)];
[path2 addLineToPoint:CGPointMake(50, rect.size.height)];
[path2 closePath];
[[UIColor lightGrayColor] setFill];
[path1 fill];
[path2 fill];

これにより、次のような継ぎ目が生成されます。 シームのスクリーンショット

これは、CGPathApply私が形状を処理するために使用しているコールバック関数で発生しているため、非常に問題があります (形状を分割し、いくつかの処理を行い、それらを再びまとめます)。このため、形状を歪ませずに継ぎ目を (オーバーラップによって) 除去するために、これらの形状をどのようにシフトする必要があるかを判断することは非常に困難です。特に、これらの形状の一部はかなり複雑です (単純な四角形ではありません)。

アンチエイリアシングをオフにすると(CGContextSetShouldAntialias(context, NO);)見た目が削除されることがわかりましたが、そうすると見苦しくなるだけなので、実際にはオプションではありません。

何か案は?

4

0 に答える 0