Вертикальный текст центра в NSSecureTextField с подклассом

Я пытаюсь вертикально центрировать текст в своих 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 "password" field

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

Ответ 1

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

Ответ 2

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

@implementation SubclassTextField

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

@end

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

@implementation SubclassTextFieldCell

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

...
@end

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

Ответ 3

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

[mySecureTextField.cell setUsesSingleLineMode:YES];