Попытка изменить выбранный текстовый цвет фона для NSTextField (у нас темный пользовательский интерфейс, и выделенный текстовый фон почти такой же, как и сам текст), но только NSTextView, кажется, позволяет нам изменить это.
Итак, мы пытаемся подделать NSTextField с помощью NSTextView, но не можем заставить текстовую прокрутку работать так же.
Самое близкое, что мы получаем, это с кодом:
NSTextView *tf = [ [ NSTextView alloc ] initWithFrame: NSMakeRect( 30.0, 20.0, 80.0, 22.0 ) ];
// Dark UI
[tf setTextColor:[NSColor whiteColor]];
[tf setBackgroundColor:[NSColor darkGrayColor]];
// Fixed size
[tf setVerticallyResizable:FALSE];
[tf setHorizontallyResizable:FALSE];
[tf setAlignment:NSRightTextAlignment]; // Make it right-aligned (yup, we need this too)
[[tf textContainer] setContainerSize:NSMakeSize(2000, 20)]; // Try to Avoid line wrapping with this ugly hack
[tf setFieldEditor:TRUE]; // Make Return key accept the textfield
// Set text properties
NSMutableDictionary *dict = [[[tf selectedTextAttributes] mutableCopy ] autorelease];
[dict setObject:[NSColor orangeColor] forKey:NSBackgroundColorAttributeName];
[tf setSelectedTextAttributes:dict];
Это работает почти хорошо, за исключением того, что, если текст длиннее текстового поля, вы не можете прокрутить его любым способом.
Есть идеи, как это сделать?
Заранее спасибо
Редактировать: Решение, предложенное ниже Джошуа Ноцци
Благодаря Джошуа, это отличное решение длячто я искал:
@interface ColoredTextField : NSTextField
- (BOOL)becomeFirstResponder;
@end
@implementation ColoredTextField
- (BOOL)becomeFirstResponder
{
if (![super becomeFirstResponder])
return NO;
NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys :
[NSColor orangeColor], NSBackgroundColorAttributeName, nil];
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self];
[fieldEditor setSelectedTextAttributes:attributes];
return YES;
}
@end
Вместо того, чтобы подделывать его с помощью NSTextView, это просто NSTextField, который изменяет выбранный цвет текста, когда он становится первым респондентом.
Редактировать: Приведенный выше код возвращается кцвет выбора ошибки, когда вы нажимаете Enter в текстовом поле.Вот способ избежать этого.
@interface ColoredTextField : NSTextField
- (BOOL)becomeFirstResponder;
- (void)textDidEndEditing:(NSNotification *)notification;
- (void)setSelectedColor;
@end
@implementation ColoredTextField
- (BOOL)becomeFirstResponder
{
if (![super becomeFirstResponder])
return NO;
[self setSelectedColor];
return YES;
}
- (void)textDidEndEditing:(NSNotification *)notification
{
[super textDidEndEditing:notification];
[self setSelectedColor];
}
- (void) setSelectedColor
{
NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys :
[NSColor orangeColor], NSBackgroundColorAttributeName, nil];
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self];
[fieldEditor setSelectedTextAttributes:attributes];
}
@end