문제

좋습니다. 콘텐츠를 넣을 섹션으로 나누어진 점선 상자를 그리려고 합니다.내 코드는 다음과 같습니다.

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top