Я пытаюсь реализовать пользовательский NSTextField
, который: a) изменяет цвет при активном состоянии и b) имеет метку в верхнем левом углу.Добавление не редактируемого NSTextField в качестве метки в другой NSTextField
У меня есть следующие реализации:
В TestTextField.h
@interface TestTextField : NSTextField
- (id)initFullWidthWithLabel:(NSString *)label andPreset:(NSString *)preset;
...
@end
В TestTextField.m
@interface TestTextField() {
BOOL _thisFieldIsActive;
}
@property (nonatomic, strong) NSTextField *label;
@end
@implementation TestTextField
- (id)initFullWidthWithLabel:(NSString *)label andPreset:(NSString *)preset {
self = [super initWithFrame:NSZeroRect];
if (self) {
_thisFieldIsActive = NO;
[self setFocusRingType:NSFocusRingTypeNone];
// small label top left
_label = [[NSTextField alloc] initWithFrame:NSZeroRect];
_label.stringValue = label;
if (preset) {
self.stringValue = preset;
}
else {
self.stringValue = @"0";
}
[self layoutUI];
}
return self;
}
- (void)turnActiveOff {
[self toggleActive:NO];
}
- (void)toggleActive:(BOOL)active {
_thisFieldIsActive = active;
if (_thisFieldIsActive) {
self.backgroundColor = [NSColor blueColor];
self.textColor = [NSColor whiteColor];
_label.textColor = [NSColor whiteColor];
}
else {
self.backgroundColor = [NSColor clearColor];
self.textColor = [NSColor blackColor];
_label.textColor = [NSColor grayColor];
}
}
- (BOOL)becomeFirstResponder {
NSLog(@"BecomeFirstResponder");
[self selectText:self];
[self toggleActive:YES];
return [super becomeFirstResponder];
}
- (void)textDidEndEditing:(NSNotification *)notification {
NSLog(@"DidEndEditing");
[self toggleActive:NO];
[super textDidEndEditing:notification];
}
- (void)layoutUI {
self.alignment = NSRightTextAlignment;
self.font = [NSFont fontWithName:@"HelveticaNeue-Light" size:32.0f];
self.layer.borderColor = [NSColor whiteColor].CGColor;
self.layer.borderWidth = 1.0f;
[self.layer setCornerRadius:4.0f];
// small label top left
_label.font = [NSFont fontWithName:@"HelveticaNeue-Light" size:12.0f];
_label.alignment = NSLeftTextAlignment;
_label.textColor = [NSColor grayColor];
_label.stringValue = [_label.stringValue uppercaseString];
_label.selectable = NO;
_label.editable = NO;
_label.drawsBackground = NO;
_label.bezeled = NO;
[self addSubview:_label];
NSDictionary *metrics = @{@"borderPadding": @5};
_label.translatesAutoresizingMaskIntoConstraints = NO;
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(borderPadding)-[_label(100)]" options:0 metrics:metrics views:@{ @"_label" : _label }]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(borderPadding)-[_label(30)]" options:0 metrics:metrics views:@{ @"_label" : _label }]];
}
В моей ViewController я реализую эти TestTextFields просто вызвав пользовательский initFullWidthWithLabel:andPreset:
метод и добавить их в качестве подпункт к VCs view
Я вижу, что метка позиционируется правильно, однако, как только поле станет активным, а backgroundColor установлен, он, похоже, скроет ярлык. Как я могу убедиться, что этикетка остается наверху? Даже когда окраска backgorund выключена, ярлык остается скрытым.
Благодаря
Это является полным из синего предложение, но вы можете попробовать использовать подслой, чтобы иметь дело с цвет фона. –
Я даже пошел дальше и полностью взял цвет фона. Затем ярлыки снова появляются, когда вы покидаете текстовое поле, но в то время как текстовое поле имеет фокус, они не видны. – Joseph