nsbezierpath对象似乎是绘制可变行宽度
-
21-12-2019 - |
题
好的,所以我正试图绘制一个细分的虚线框,该盒子被细分为我要放置内容的部分。这是我的代码:
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。变量标题是指监视中的另一个视图,我基于所关闭的线路的位置。
这是本代码实际绘制的屏幕截图(显然标签除外):
您可以看到,除非我们处理非常不幸的光学幻觉,我怀疑,盒子中包含的分隔符似乎比盒子的轮廓厚。我明确地将路径对象的阵容设置为三个,所以我不确定为什么。我会非常感谢任何可以提供的建议。
解决方案
好的,我认为问题是你的外部盒子只是被视图的边缘剪裁。您要求一行为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