NSTextField için seçilen metin arka plan rengini değiştirmeye çalışıyoruz (karanlık bir arayüze sahibiz ve seçilen metin arka planı neredeyse metnin kendisiyle aynıdır), ancak yalnızca NSTextView bunu değiştirmemize izin veriyor gibi görünüyor.Güzel renklendirme elde etmek için NSTextView kullanarak bir NSTextField öğesini yayınlama?
Yani NSTextView kullanarak bir NSTextField sahtesini yapmaya çalışıyoruz, ancak aynı işi yapmak için metin kaydırma yapamıyoruz.
aldığımız en yakın bu kodla geçerli:
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];
Bu işleri neredeyse tamam metin uzun metin alanına daha uzunsa, herhangi bir şekilde ilerleyip edemez hariç.
Bunu nasıl gerçekleştireceğiniz konusunda bir fikriniz var mı? peşin
Teşekkür
Düzenleme: Çözüm Joshua Joshua Nozzi
üyeye aşağıda önerilen, bu büyük bir çözümdür ı aradığı şeyi:
@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
yerine taklit Bir NSTextView ile, sadece ilk cevaplayıcı olduğunda seçilen metin rengini değiştiren bir NSTextField var.
Düzelt: Yukarıdaki kod, metin alanına Enter tuşuna bastığınızda varsayılan seçim rengine geri döner. Bundan kaçınmanın bir yolu.
@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
sadece metin alanı en
field editor özelliklerini ayarlanmamış Neden
Bu cevaba bir başka soruya bir bakın. Bir NSTokenField (NSTextField'ın bir alt sınıfı olan alan düzenleyicisini nasıl manipüle edeceğini gösterir, bu nedenle tam olarak aynı şekilde çalışır). http://stackoverflow.com/questions/2995205/prevent-selecting-all-tokens-in-nstokenfield –
Metin alanının alan düzenleyicisi bir NSText nesnesidir ve bu sınıfta setSelectedTextAttributes yöntemi yoktur. Bir şeyi kaçırmadığım sürece, bu şekilde yapılabilir gibi görünmüyor. – hasvn
@hasvn: Bu kafa karıştırıcı ... '- [NSWindow alanEditor: forObject:] için prototipin 'NSText *' döndürdüğünü, ancak belgelerin alan düzenleyicisinin bir NSTextView nesnesi olduğunu söylüyor. – JWWalker