Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vertically Centre Text in NSSecureTextField with subclassing

I'm trying to vertically centre text in my NSTextFields, but one of them is for a password, so it's a NSSecureTextField. I've set it's class to be MDVerticallyCenteredSecureTextFieldCell with the following implementation:

- (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];
}

A similar subclass is already working for regular NSTextFieldCells, just not secure versions of this. It seems like Apple has somehow protected these methods from being overridden.

Now the password field is the only one misaligned:

misaligned "password" field

Can anyone suggest a way get the NSSecureTextFieldCell subclass's methods to be called or another way to vertically centre the text field?

like image 878
Ash Furrow Avatar asked Feb 22 '12 18:02

Ash Furrow


1 Answers

You can create subclass of the NSSecureTextField like:

@implementation SubclassTextField

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

@end

and the subclass of the cell:

@implementation SubclassTextFieldCell

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

...
@end

If you do so then methods from subclassed NSSecureTextField will start working.

like image 129
sliwinski.lukas Avatar answered Nov 15 '22 22:11

sliwinski.lukas