2009-04-19 6 views
0

J'expérimente la création d'une barre d'étendue personnalisée utilisant des objets NSButtonCell en retrait. Cependant, j'ai de la difficulté à dessiner la lunette lorsque la souris est en vol stationnaire. Je peux le faire fonctionner en créant des zones de suivi et en plaçant showsBorderOnlyWhileMouseInside à NO pendant que la souris est à l'intérieur, et YES quand il se déplace dehors, mais cela me semble un hack, d'autant plus que NSButtonCell fera le tracking tout seul. Si j'utilise la méthode setCell du contrôle, la cellule de bouton appelle le contrôle addTrackingRect du contrôle: owner: userData: assumeInside: et configure son propre suivi pour dessiner le cadre lorsque la souris est en vol stationnaire. Cependant, si je veux utiliser plusieurs cellules boutons dans le même contrôle, j'essaie de définir controlView de chaque cellule sur le contrôle personnalisé en utilisant la méthode setControlView de la cellule bouton, mais cela n'invite pas la cellule à configurer des zones de suivi comme setCell. La technique doit être possible puisque NSMatrix le fait, mais après avoir lu toutes les API et tous les forums disponibles, je n'ai pas trouvé le moyen d'initier le comportement de suivi de NSButtonCell sans utiliser la méthode setCell de son contrôle. Mon front est sanglant de battre contre le bureau - de l'aide serait appréciée.Plusieurs NSButtonCells encastrées dans un contrôle personnalisé

Répondre

1

Je suis revenu à celui-ci plus tard et a découvert que si vous modifiez la sous-classe personnalisée à NSControl au lieu de NSView, la méthode addTrackingRect est prise en charge automatiquement par la cellule. Appelez simplement les méthodes mouseEntered/mouseExited de la cellule si nécessaire pour implémenter le mode survolé de la cellule. J'espère que cela aide quelqu'un.

0

Tout d'abord, un pansement pourrait être la première chose qui pourrait aider. ;)

Avez-vous essayé d'utiliser la méthode -updateTrackingAreaWithFrame de NSButtonCell: inView:? Il n'est pas documenté, mais apparaît dans l'en-tête NSButtonCell généré par la classe-dump sur Leopard. Je ne suis pas sûr de ce que le mot officiel ou consensus général est en ce qui concerne l'utilisation de méthodes non documentées qui ne commencent pas par des traits de soulignement, alors caveat emptor. Sur une autre note: Au lieu d'utiliser plusieurs boutons button, vous pouvez utiliser plusieurs boutons dans une vue pour cette tâche. Modéliser votre propre classe après une classe existante comme NSMatrix est admirable, mais pour des comportements complexes comme ce que vous cherchez, il est souvent plus utile de dévier un peu. Le concept que utilisant de nombreuses vues au lieu d'utiliser une seule vue avec un tas de cellules est cher a encore un certain mérite, mais si aller cette route nécessite une mise en œuvre hacky, je irais dans l'autre sens.

+0

Merci, Dirk - Je suis entièrement d'accord. Je pense que l'éloge de la documentation de NSCell m'a fait me sentir coupable d'utiliser des boutons. Je pensais que je chasserais le trou de rats pendant un certain temps, mais il ne semble pas y avoir de solution satisfaisante pour mettre en œuvre ceci. J'ai essayé la méthode updateTrackingAreaWithFrame: inView: mais elle n'a pas fait l'affaire. En regardant la pile lorsque Cocoa le fait avec un NSButton, un tas d'API privées se font passer, donc il ne semble pas que nous soyons supposés le faire nous-mêmes. –

Questions connexes