Вертикальный центр текста в NSSecureTextField с подклассами - PullRequest
10 голосов
/ 22 февраля 2012

Я пытаюсь расположить текст по центру в моих полях NSTextFields, но одно из них предназначено для пароля, поэтому это NSSecureTextField.Я установил, что его класс MDVerticallyCenteredSecureTextFieldCell со следующей реализацией:

- (NSRect)adjustedFrameToVerticallyCenterText:(NSRect)frame {
    // super would normally draw text at the top of the cell
    NSInteger offset = floor((NSHeight(frame) - 
                              ([[self font] ascender] - [[self font] descender])) / 2);
    return NSInsetRect(frame, 0.0, offset+10);
}

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView
               editor:(NSText *)editor delegate:(id)delegate event:(NSEvent *)event {
    [super editWithFrame:[self adjustedFrameToVerticallyCenterText:aRect]
                  inView:controlView editor:editor delegate:delegate event:event];
}

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView
                 editor:(NSText *)editor delegate:(id)delegate 
                  start:(NSInteger)start length:(NSInteger)length {

    [super selectWithFrame:[self adjustedFrameToVerticallyCenterText:aRect]
                    inView:controlView editor:editor delegate:delegate
                     start:start length:length];
}

- (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)view {
    [super drawInteriorWithFrame:
     [self adjustedFrameToVerticallyCenterText:frame] inView:view];
}

-(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    [super drawWithFrame:cellFrame inView:controlView];
}

Подобный подкласс уже работает для обычных NSTextFieldCell s, только небезопасные версии этого,Похоже, что Apple каким-то образом защитила эти методы от переопределения.

Теперь поле пароля является единственным смещенным:

misaligned

Может кто-нибудь предложить способ получитьметоды подкласса NSSecureTextFieldCell для вызова или другой способ вертикального центрирования текстового поля?

Ответы [ 3 ]

24 голосов
/ 13 июня 2012

Попробуйте использовать обычный NSTextField с вашим подклассом NSSecureTextFieldCell внутри. У меня была такая же проблема, и эта комбинация сработала.

4 голосов
/ 05 ноября 2016

Вы можете создать подкласс NSSecureTextField, например:

@implementation SubclassTextField

+ (Class)cellClass {
    return [SubclassTextFieldCell class];
}

@end

и подкласс ячейки:

@implementation SubclassTextFieldCell

- (NSRect)drawingRectForBounds:(NSRect)rect {
    // It will be working
    ...
}

...
@end

Если вы сделаете это, то методы из подкласса NSSecureTextFieldначнет работать.

2 голосов
/ 04 ноября 2014

Все, что вам нужно сделать для вертикального центрирования текста заполнителя в NSTextField или NSSecureTextField, - это установить флажок «Использовать однострочный режим» в Инспекторе атрибутов (раздел «Текстовое поле»). Если вы не используете IB, вы можете установить его программно следующим образом:

[mySecureTextField.cell setUsesSingleLineMode:YES];
...