2009-09-26 2 views
0

J'essaye de créer par programme une fenêtre avec contentView personnalisé et un contrôle personnalisé NSTextField, mais j'ai de la difficulté à obtenir cette hiérarchie de fenêtres et de vues à dessiner.drawRect ne pas être appelé sur sous-vue ajoutée

Je crée une fenêtre sans bordure personnalisée et remplace ses accesseurs setContentView/contentView. Cela semble fonctionner correctement et les méthodes initWithFrame et drawRect de contentView sont appelées pour que contentView se dessine correctement. Mais dès que j'essaye d'ajouter par programmation NSTextField à contentView, il n'est pas ajouté ou dessiné. En disant coutume je veux dire que je la remplacer est désignée initialiseur (initWithFrame:frame - uniquement pour le réglage police personnalisée) et la méthode drawRect qui ressemble à ceci:

- (void)drawRect:(NSRect)rect { 
    NSRect bounds = [self bounds]; 
    [super drawRect:bounds]; 
} 

La coutume de initialiseur de contentView ressemble à ceci:

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self != nil) { 
     // i want to draw itself to the same 
     // size as contentView thus i'm using same frame 
     CustomTextField *textField = [[CustomTextField alloc] initWithFrame:frame]; 
     [self addSubview:textField]; 
     [self setNeedsDisplay:YES]; 
    } 
    return self; 
} 

J'ai été strugling avec cela pendant quelques heures, donc les pointeurs sont très appréciés. Plus de code est disponible sur demande.)

Répondre

2

Merci pour vos réponses!

J'ai trouvé mon propre problème. La raison pour laquelle drawRect n'a pas été appelée est parce que le champ de texte personnalisé a été dessiné en dehors de la vue du contenu. Je suppose que j'ai oublié de mentionner les détails cruciaux que je suis en train de dessiner la fenêtre centrée sur l'écran donc son cadre était avec décalage x/y.

Pour remplir la fenêtre avec la vue de contenu I init contentView avec la même image que la fenêtre (ce qui signifie le même décalage (x; y) par rapport au point (0; 0) de la fenêtre).

Maintenant, je suis simplement incapable d'écrire sur un champ de texte personnalisé, mais c'est un autre problème que je suis capable de gérer.

2

Votre -drawRect: override me semble faux, pourquoi ignoreriez-vous délibérément l'argument rectal passé? Pourquoi est-ce nécessaire?

En ce qui concerne la raison pour laquelle le champ de texte n'apparaît pas, c'est probablement parce que vous ne l'avez pas configuré. Lorsque vous créez un NSTextField dans le code, vous n'obtenez pas la même chose que l'instance par défaut que vous obtenez lorsque vous faites glisser un champ de texte sur une vue dans IB. Vous devrez configurer le NSTextField et son NSTextFieldCell pour obtenir l'apparence que vous désirez.

J'utilise un champ de texte ajouté que programme configurer comme ceci:

_textField = [[NSTextField alloc] initWithFrame:textFieldRect]; 
[[_textField cell] setControlSize:NSSmallControlSize]; 
[_textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; 
[_textField setBezelStyle:NSTextFieldSquareBezel]; 
[_textField setDrawsBackground:YES]; 
[_textField setBordered:YES]; 
[_textField setImportsGraphics:NO]; 
[_textField setAllowsEditingTextAttributes:NO]; 
[_textField setBezeled:YES]; 
[_textField sizeToFit]; 
[self addSubview:_textField]; 
[_textField setFrame:textFieldRect]; 
[_textField setAutoresizingMask:NSViewMinXMargin]; 
+1

Eh bien, j'ai même essayé de ne pas surcharger la méthode 'drawRect' ou simplement de dessiner un rectangle noir. La raison pour laquelle j'ignore le paramètre 'rect' est parce qu'il ne définit que la zone qui doit être redessinée. Par exemple lorsque le curseur sur le champ de texte clignote - OS envoie drawRect avec un message avec le paramètre rect qui ne définit que la zone de ce curseur. Merci pour vos conseils, je vais essayer de le suivre. – Eimantas

Questions connexes