Question

Je suis de la création d'un NSCell la sous-classe qui attire certains des objets directement sur la vue (à l'aide de drawInRect:fromRect:operation:fraction:respectFlipped:hints:) et attire également l'un NSButton exemple simplement à l'aide de NSView de l' addSubview: sélecteur.

Alors que les objets dessinés à l'aide de la première méthode dessiner tout correctement, je vais avoir des problèmes avec le dessin de la NSButton correctement.Le problème est que mon NSButton les instances attirer dans les bons endroits, mais plusieurs fois.

J'ai fait des recherches sur internet pour un certain temps et certaines personnes ont suggéré d'utiliser un cache, mais je ne sais pas si c'est efficace.(allez un tableau contenant des boutons à l'aide d'une boucle for va certainement ralentir le défilement depuis j'ai beaucoup d'affichage de données...)

Comment voulez-vous faire cela?Suis-je fausse route?

C'est le code correspondant:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{    
    NSRect _controlRect = cellFrame;

    float _Y = cellFrame.origin.y;

    NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);

    _switch = [self _choiceSwitch];

    [_switch setFrame:_accessoryRect];
    [controlView addSubview:_switch];
}
Était-ce utile?

La solution

Longue histoire courte: Les amis ne laissez pas vos amis addSubview, tandis que le dessin.

Ce fondamental, et pas particulièrement bien expliqué des aspects de la gestion des interfaces de contrôle, mais il est important de se familiariser avec des.

Laissez vos contrôleurs de dicter la "commande" de sous-vues, et vous pouvez dormir tranquillement en sachant que ce bouton ne devrait pas avoir ouvertement couché sur (ce qui n'est PAS le cas si l'on se bouscule autour de l'intérieur de votre dessin personnalisé routines).

Il est facile de se retrouver piégé dans cette ruelle, cause, comme, hey, j'ai ajouté un NSImageView dans mon initWithFrame et tout semble être correct... Mais c'est juste une sorte de pas de la façon dont vous êtes censé le faire, Je suppose... et lorsque vous démarrez sous-classement NSControl, etc.c'est quand vous commencez à comprendre pourquoi.

Mise à jour: Voici une très bonne écriture sur la conception des contrôles personnalisés avec un tout aussi excellent exemple de projet attaché - qui incarne le type de code de l'organisation qui peut vous aider à éviter ce type de problème.Par exemple..vous remarquerez que dans la classe de contrôleur de la façon dont il garde chaque bouton séparé, unique et indépendant des autres points de vue " business...

for (int butts = 0; butts < 3; butts++) {
    NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
    ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
    [mainView addSubview:butt];
}

enter image description here

Autres conseils

Le “dessin” NSButton en ajoutant une instance en vue de la hiérarchie à chaque fois que vous dessinez la cellule elle-même est certainement une mauvaise idée.Au lieu de cela, créer un NSButtonCell et le configurer à votre goût.Puis, dans votre -[NSCell drawInteriorWithFrame:inView:] l'utilisation d'une cellule ivar pour dessiner son apparence.

Si vous voulez avoir un lien NSButton instance dans chaque cellule de la table, essayez d'éviter un appel à addSubview: lorsque cela est possible.Chaque fois que vous faites cela, le contrôle de la vue peut annuler sa mise en page et redessiner le tout à partir de zéro faire une sorte de récursivité dans votre cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top