Вопрос

Хорошо, я пытаюсь нарисовать пунктирную рамку, разделенную на разделы, в которые я собираюсь поместить контент.Вот мой код:

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

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

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

Это было полезно?

Решение

Хорошо, я думаю, проблема в том, что ваш внешний блок просто обрезается по краям поля зрения.Вы запрашиваете линию шириной 3 очка, поэтому, если ваш dirtyRect — это фактические границы представления, тогда 1,5 точки окружающего прямоугольника будут снаружи вид, поэтому вы увидите только 1,5 точки краевых линий.

Внутренние линии показывают полную толщину по трем точкам.

Вы можете исправить это, выполнив что-то вроде:

const CGFloat lineWidth = 3;
NSBezierPath *const path = [NSBezierPath bezierPathWithRect:NSInsetRect(dirtyRect, lineWidth/2, lineWidth/2)];
path.lineWidth = lineWidth;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top