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, эквивалентный границам представления. Переменная header ссылается на другое представление в суперпредставлении, из которого я строю расположение строк.

Вот скриншот того, что этот код на самом деле рисует (за исключением, очевидно, метки):

Как вы можете видеть, если только мы не имеем дело с очень неудачной оптической иллюзией, которая, я сомневаюсь, разделители, содержащиеся в коробке, кажутся более толстыми, чем контур коробки. Я явно установил lineWidth объекта path равным трем, поэтому я не уверен, почему это так. Я был бы очень признателен за любые предложения, которые могут быть предоставлены.

1 ответ

Решение

Хорошо, я думаю, что проблема в том, что ваша внешняя коробка просто обрезается по краям своего обзора. Вы просите линию шириной 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;
Другие вопросы по тегам