12
votes

Texte central vertical dans NSSECureTextField avec sous-classement

J'essaie de centrer verticalement le texte dans mes champs NstextFields, mais l'un d'entre eux est pour un mot de passe, il s'agit donc d'un NSSCureTextField. J'ai défini sa classe pour être MdverticoMCenteredSecureTextFieldCell Code> avec l'implémentation suivante:

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


0 commentaires

3 Réponses :


26
votes

Essayez d'utiliser un nstextfield régulier, avec votre sous-classe NSSECuretextFieldCellcell à l'intérieur. J'ai eu le même problème et cette combinaison a fonctionné.


1 commentaires

Travaillé pour moi aussi :)



2
votes

Tout ce que vous avez à faire pour centrer verticalement le texte de l'espace réservé dans un nstextfield code> ou NSSecureTextField code> cochez la case "Utilise le mode de ligne unique" dans l'inspecteur des attributs (texte Section de terrain). Si vous n'utilisez pas IB, vous pouvez la définir de manière programmatique de manière programmatique:

[mySecureTextField.cell setUsesSingleLineMode:YES];


0 commentaires

4
votes

Vous pouvez créer une sous-classe du nsecuretextfield comme: xxx

et la sous-classe de la cellule: xxx < P> Si vous le faites, les méthodes de sous-classement nsecuretextfield commenceront à fonctionner.


1 commentaires

C'est la bonne réponse. L'attribution d'une classe de cellules personnalisée dans le constructeur d'interface n'est pas suffisante. - [NSSECURETExtField initwithCoder:] vérifie la classe de la cellule décodée et créera une nouvelle instance s'il ne correspond pas à + cellclass .