NSBezierPath对象似乎是绘制可变线宽

时间:2014-02-26 03:25:25

标签: objective-c cocoa drawing nsbezierpath thickness

好的,所以我正在尝试画一个虚线框,它被细分为我要放置内容的部分。这是我的代码:

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];

这包含在我的自定义视图的drawRect方法中,因此dirtyRect是一个等同于视图边界的NSRect。变量标题引用了superview中的另一个视图,我将这些视图的位置基于。

以下是此代码实际绘制的屏幕截图(显然除了标签):

正如你所看到的,除非我们处理一个非常不幸的视错觉,我怀疑,包装盒中的分隔物看起来比盒子的轮廓更厚。我已经明确地将路径对象的lineWidth设置为3,所以我不确定为什么会这样。我非常感谢可以提供的任何建议。

1 个答案:

答案 0 :(得分:3)

好吧,我认为问题是你的外盒刚刚被它的视图边缘剪掉了。你要求一条宽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;