내 앱 중 하나의 UI를 사용자 정의하고 있는데, 초점이 맞지 않으면 처음에는 텍스트 영역이 회색 테두리로되어 있고 초점이 맞으면 경계가 밝은 흰색이됩니다. 내 응용 프로그램은 어두운 테마를 사용하며, 한 줄로 된 NSTextField
의 경우이 기능이 훌륭합니다.NSScrollView를 서브 클래 싱하기 drawRect : 메서드
서브 클래스가 NSTextView
인 문제가 있습니다. 국경을 적절히 변경하기 위해 실제로 부모 하위 클래스 NSScrollView
을 서브 클래스해야했지만 이상한 행동을 보았습니다. (아래 스크린 샷을 참조하십시오.) I 전체 스크롤보기를 채우기위한 빨간색 상자가 필요합니다.이 방법을 사용하면 경로를 테스트 할 수있는 채우기 대신에 멋진 테두리를 만들 수 있습니다. 대신 빨간색 상자는 내부 하위보기 만 채우는 것처럼 보입니다. NSScrollView
서브 클래스입니다
다음 코드 : 아래와 같이
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
NSRect borderRect = self.bounds;
borderRect.origin.y += 1;
borderRect.size.width -= 1;
borderRect.size.height -= 4;
BOOL inFocus = ([[self window] firstResponder] == self);
if (!inFocus) {
inFocus = [self anySubviewHasFocus:self];
}
if (inFocus) {
[[NSColor colorWithDeviceRed:.8 green:.2 blue:0 alpha:1] set];
} else {
[[NSColor colorWithDeviceRed:.1 green:.8 blue:0 alpha:1] set];
}
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext] setShouldAntialias:NO];
[NSBezierPath fillRect:borderRect];
[NSGraphicsContext restoreGraphicsState];
NSLog(@"My bounds: %@", NSStringFromRect(borderRect));
NSLog(@"Super (%@) bounds: %@", [self superview], NSStringFromRect(borderRect));
}
은 스크린 샷을 생성합니다. 또한 로그의 출력을 확인하십시오. 은에서 전체보기를 채워야한다고 제안합니다. 이것은 내부에있는 텍스트의 크기에 관계없이 지금까지 보여준 유일한 출력입니다. 캐리지 리턴을 입력하면 빨간색 상자의 높이가 증가하지만 출력은 다릅니다. (그리고 전체 경계를 채우기 위해 빨간색 상자를하고 싶습니다.)
2011-04-08 21:30:29.789 MyApp[6515:903] My bounds: {{0, 1}, {196, 87}}
2011-04-08 21:30:29.789 MyApp[6515:903] Super (<EditTaskView: 0x3a0b150>) bounds: {{0, 1}, {196, 87}}
편집 : 덕분에 그의 대답에 대한 조쉬 캐스 웰합니다. 집중하지 않을 때와 집중했을 때의 올바른 행동은 아래를보십시오.
테두리를 항상 완전히 보시겠습니까, 아니면 텍스트보기의 가장자리가 보이는 영역에만 보이게할까요? – ughoavgfhw
좋은 질문입니다. 스크롤 뷰 경계를 경계로 항상 경계선을 표시하고 싶습니다. 테두리는 항상 표시되지만 첫 번째 응답자가 아닌 경우 밝은 회색이되고 포커스가있는 경우 밝은 흰색이됩니다. (어두운 배경에 있습니다.) –
이것은 클리핑에 문제가있는 것 같습니다. 'CGContextGetClipBoundingBox ((CGContextRef) [[NSGraphicsContext currentContext] graphicsPort]);)를 사용하여 현재 클리핑 rect를 찾고 그것이 무엇인지 게시하십시오. '[super drawRect :]'를 호출하지 않아도 문제를 해결할 수 있습니다. NSScrollView는 대개 아무 그림도 그리지 않기 때문에 괜찮습니다. – ughoavgfhw