2009-09-26 19 views
0

Je suis complètement perplexe avec ce problème. J'ai fait un contrôle de recherche personnalisé qui utilise quelques classes différentes. Pour une raison quelconque, lorsqu'un champ NSTextField se trouve n'importe où sur ces différentes pièces, il affiche une bordure noire et le curseur ne clignote pas.NSTextField en haut du dessin personnalisé - le contour noir et le curseur ne clignotent pas?

Si quelqu'un a quelques minutes - j'ai rassemblé mon code sur pastebin.

Voici une image du contrôle de recherche, et à quoi il ressemble dans ce cas particulier:

http://imgur.com/6y8qx.png

Le contrôle de recherche est assis sur une vue gradient:
http://pastebin.com/m43fde2b6

Le contrôle de recherche est reconstitué avec ce code:
http://pastebin.com/m5be08c32

La partie graphique réelle du contrôle de recherche est construit à partir de deux classes:
http://pastebin.com/m5bfa9439
http://pastebin.com/m5e909a2f (classe) étend au-dessus

Je ne peux pas trouver ce que le diable est faux. Le texte fonctionne, mais il y a une bordure noire et le curseur ne clignote pas. Qu'est-ce que je fais mal? Arg, je tire mes cheveux depuis des jours sur celui-ci.

Répondre

1

L'affichage d'une vue sur une vue frère n'a jamais été correctement pris en charge sous Mac OS X. Essayez plutôt d'en faire une sous-vue. Vous pouvez même en faire un composant privé d'une vue de champ de recherche dédiée. Sur cette note, y a-t-il une raison pour laquelle vous n'utilisez pas NSSearchField?

+0

Je n'utilise pas NSSearchControl car j'ai des graphiques personnalisés. NSSSearchControl fait la même chose avec la bordure noire et ne met pas à jour le curseur. Faire de la zone de recherche une sous-vue ne le fait pas non plus. – gngrwzrd

0

Je l'ai compris! Finalement. Ce que je n'ai pas réalisé, c'est le paramètre "saleRect" de la méthode "drawRect:", c'est la partie du contrôle qui est "sale", ce qui signifie qu'elle doit être redessinée. Donc, quand un NSTextField est au-dessus d'un contrôle, il déclenchera le "drawRect:" de ce contrôle à différentes reprises - avec différents paramètres "dirtyRect".

1: le curseur - généralement un NSMakeRect (textField.origin.x, textfield.origin.y, 1, textfield.origin.height). 2: le champ de champ de texte 3: la taille du champ sur lequel le champ de texte est placé. Donc, le correctif était simple, changez le dessin à l'échelle 9 de mon contrôle pour toujours dessiner sur [auto-frame]. Vous pouvez voir le changement ici: http://pastebin.com/m50a5b0ad (ligne 89).

Auparavant, il dessinait au paramètre "rect" (http://pastebin.com/m5e909a2f - ligne 88), mais en fonction de l'origine de l'appel drawRect, le paramètre rect était de tailles différentes.