2014-12-20 3 views
1

Я пытаюсь реализовать пользовательский 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 выключена, ярлык остается скрытым.

Благодаря

+0

Это является полным из синего предложение, но вы можете попробовать использовать подслой, чтобы иметь дело с цвет фона. –

+0

Я даже пошел дальше и полностью взял цвет фона. Затем ярлыки снова появляются, когда вы покидаете текстовое поле, но в то время как текстовое поле имеет фокус, они не видны. – Joseph

ответ

0

Ядро решения было использовать пользовательские подклассы NSTextFieldCell одним способом:

- (NSRect)drawingRectForBounds:(NSRect)rect { 
    NSRect rectInset = NSMakeRect(rect.origin.x + 100.0f, rect.origin.y, rect.size.width - 100.0f, rect.size.height); 
    return [super drawingRectForBounds:rectInset]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^