2014-02-26 21 views
0

好的,所以我想绘制一个虚线框,将其细分成要放置内容的部分。这里是我的代码:NSBezierPath对象似乎正在绘制可变线宽

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相当于视图的边界。变量标题引用超级视图中的另一个视图,我将这些行的位置作为基础。

下面是这段代码的实际绘制的截图(除标签明明):

正如你所看到的,除非我们正在处理一个非常不幸的光学错觉,我怀疑,包装盒中的分隔器看起来比盒子的轮廓厚。我已明确地将path对象的lineWidth设置为三,所以我不确定这是为什么。我会很感激任何可以提供的建议。

回答

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; 
+0

完美!我自己从来没想过这件事,但当你考虑这件事时,它会非常有意义。视图外的东西会被裁剪掉,并且从线条边缘绘制没有任何意义。 –