Я настраиваю пользовательский интерфейс для одного из моих приложений, и идея заключается в том, что текстовая область изначально имеет серый оттенок, когда не в фокусе, а когда она попадает в фокус, рамка становится ярко-белой.Мое приложение использует темную тему, и для однострочного NSTextField
это прекрасно работает.
Однако у меня возникают проблемы с подклассами 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));
}
Создает снимок экрана, как виднониже.Кроме того, посмотрите вывод в журнале, который предлагает , что весь вид должен быть заполнен.Это единственный вывод, который когда-либо показывался, независимо от размера текста внутри.Ввод возвратов каретки увеличивает высоту поля red , но не дает другого выхода.(И я бы хотел, чтобы красная коробка заполняла все границы.)
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}}
Редактировать: Спасибо Джош Касвелл за ответ.См. Ниже для правильного поведения, когда не в фокусе, а когда в фокусе.