Ответ 1
Попробуйте использовать обычный NSTextField с вашим подклассом NSSecureTextFieldCell внутри. У меня была та же проблема, и эта комбинация работала.
Я пытаюсь вертикально центрировать текст в своих 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 каким-то образом защитила эти методы от переопределения.
Теперь поле пароля является единственным несогласованным:
Может ли кто-нибудь предложить способ получить методы подкласса NSSecureTextFieldCell
для вызова или другой способ вертикального центрирования текстового поля?
Попробуйте использовать обычный NSTextField с вашим подклассом NSSecureTextFieldCell внутри. У меня была та же проблема, и эта комбинация работала.
Вы можете создать подкласс NSSecureTextField
, например:
@implementation SubclassTextField
+ (Class)cellClass {
return [SubclassTextFieldCell class];
}
@end
и подкласс ячейки:
@implementation SubclassTextFieldCell
- (NSRect)drawingRectForBounds:(NSRect)rect {
// It will be working
...
}
...
@end
Если вы это сделаете, начнут работать методы из подкласса NSSecureTextField
.
Все, что вам нужно сделать, чтобы вертикально центрировать текст заполнителя в NSTextField
или NSSecureTextField
, - это флажок "Использовать режим одиночной линии" в инспекторе атрибутов (раздел "Текстовое поле" ). Если вы не используете IB, вы можете установить его программно так:
[mySecureTextField.cell setUsesSingleLineMode:YES];