NSBEZIERPATHオブジェクトは変数行幅を描画しているようです
-
21-12-2019 - |
質問
OK、私は内容を置くつもりのセクションに細分された破線のボックスを描こうとしています。これが私のコードです:
NSBezierPath *path = [NSBezierPath bezierPathWithRect:dirtyRect];
[path setLineWidth:3];
CGFloat pattern[2] = {5, 5};
[path setLineDash:pattern count:2 phase:0];
CGFloat totalHeight = header.frame.origin.y - 10;
CGFloat sectionOffset = 0;
if([game getNumPlayers] == 2) {
sectionOffset = totalHeight / 2;
} else if([game getNumPlayers] == 3) {
sectionOffset = totalHeight / 3;
} else if([game getNumPlayers] == 4) {
sectionOffset = totalHeight / 4;
}
for(int i = 0; i < [[game getPlayers] count]; i++) {
[path moveToPoint:NSMakePoint(0, totalHeight - (sectionOffset * i))];
[path lineToPoint:NSMakePoint(dirtyRect.size.width, totalHeight - (sectionOffset * i))];
}
[path stroke];
.
これは私のカスタムビューの作成方法内に含まれるため、DirtyRectはビューの境界に相当するNSRECTです。変数ヘッダーとは、SuperViewの別のビューを参照しています。
これは、このコードが実際に描画するもののスクリーンショットです(ラベルを明らかにラベルを除く):
あなたが見ることができるように、私たちが疑う非常に残念な光学的錯覚を扱うことができない限り、箱に含まれている仕切りは箱の輪郭よりも厚いようです。Pathオブジェクトの線幅を明示的に3に設定するので、これがなぜなのかわかりません。私は提供できるあらゆる提案に多くの感謝があるでしょう。
解決
OK、私はあなたの外のボックスがそのビューのエッジによって切り取られたばかりであるという問題があると思います。あなたは3点幅の行を尋ねるので、dirtyRect
がビューの実際の境界である場合は、囲んでいるボックスの1.5ポイントが のになりますので、1.5ポイントしか表示されません。エッジラインの。
内線は全3点の厚さを示しています。
あなたは次のようなことをすることによってこれを修正することができます:
const CGFloat lineWidth = 3;
NSBezierPath *const path = [NSBezierPath bezierPathWithRect:NSInsetRect(dirtyRect, lineWidth/2, lineWidth/2)];
path.lineWidth = lineWidth;
. 所属していません StackOverflow