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];
이는 내 사용자 정의 뷰의 drawRect 메소드 내에 포함되어 있으므로 dirtyRect는 뷰의 경계에 해당하는 NSRect입니다.변수 헤더는 라인 위치의 기반이 되는 superview의 또 다른 뷰를 참조합니다.
다음은 이 코드가 실제로 그리는 내용에 대한 스크린샷입니다(분명히 라벨은 제외).
보시다시피, 매우 불행한 광학적 환상을 다루지 않는 한, 상자에 포함된 칸막이는 상자의 윤곽선보다 더 두꺼워 보입니다.경로 개체의 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;
제휴하지 않습니다 StackOverflow