Domanda

Sto creando una sottoclasse NSCell che disegna alcuni oggetti direttamente sulla vista (utilizzando drawInRect:fromRect:operation:fraction:respectFlipped:hints:) e disegna anche un'istanza NSButton semplicemente utilizzando il selettore addSubview: NSView.

Sebbene gli oggetti disegnati utilizzando il primo metodo tutti disegni correclty, sto avendo problemi con il disegno del NSButton correttamente.Il problema è che le mie istanze NSButton disegneranno nei posti giusti, ma più volte più volte.

L'ho ricercato su Internet per un po 'e alcune persone hanno suggerito di usare una cache, ma non sono sicuro se questo è efficiente.(Andando un array contenente pulsanti usando A per il loop sicuramente causerà lo scorrimento lento poiché mostra un sacco di dati ...)

Come faresti questo?Sto abbaiando l'albero sbagliato?

Questo è il codice pertinente:

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

È stato utile?

Soluzione

Short Story Short : Amici non lasciano gli amici addSubview, mentre disegnano.

Questo è un aspetto fondamentale e non particolarmente ben spiegato della gestione delle interfacce di controllo, ma è importante venire a prendere le grip.

Lascia che i tuoi controller dettino il "ordine" della sottoviews, e puoi dormire strettamente sapendo che quel pulsante non dovrebbe essere maltrattato (che non è il caso se si sta facendo smentire all'interno delle routine di disegno personalizzate). .

È facile da intrappolare in questo vicolo, causa, come, hey, ho aggiunto un NSImageView nel mio initWithFrame e tutto sembra essere a posto ... ma è semplicemente tipo come te Dovrebbe farlo , immagino ... e quando inizi a sottocassando Nscontrol, ecc. È quando inizi a capire perché.

Aggiornato: Ecco davvero una buona notizia sulla progettazione di personalizzate Controlli con un ugualmente come grande progetto di esempio allegato - che incarna il tipo di organizzazione del codice che può aiutare a evitare questo tipo di problema. Ad esempio .. noterai nella classe del controller come sta mantenendo ogni pulsante separato, unico e indipendente da altre viste "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];
}
.

Inserisci Descrizione dell'immagine qui

Altri suggerimenti

"Disegno" NSButton aggiungendo la sua istanza nella gerarchia di vista ogni volta che disegni la cella stessa è sicuramente una cattiva idea.Invece, crea un nsbuttoncell e configurarlo fino ai tuoi gusti.Quindi, nel tuo -[NSCell drawInteriorWithFrame:inView:] usa una cella IVAR per disegnare il suo aspetto.

Se si desidera avere un'istanza NSButton cliccabile in ciascuna cella della vista tabella, provare a evitare una chiamata a addSubview: quando possibile.Ogni volta che lo fai, la vista di controllo potrebbe invalidare il suo layout e ri-disegnare tutto da zero facendo una specie di ricorsione nel tuo caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top