2013-10-21 16 views
5

Ho creato una vista Contenitore che contiene un gruppo di viste secondarie: una vista raccolta, una barra degli strumenti personalizzata e alcuni frammenti.drawRect su subviews?

Il disegno ha un bordo sul lato superiore, sinistro e destro, ma non sul fondo, quindi ho eseguito il comando drawRect per includere il bordo.

Quando ho aggiunto la barra degli strumenti, ho notato che appare sopra la parte superiore del bordo. (Per qualche ragione inizialmente pensavo che non lo sarebbe, ma ovviamente lo fa!).

C'è comunque che posso dire a drawRect di disegnare sopra la parte superiore delle mie sottoview?

Naturalmente c'è un sacco di altri modi per risolvere il mio problema (regolare il telaio della barra degli strumenti, per esempio), tuttavia mi sto chiedendo questa domanda al fine di ottenere una profonda comprensione di opere come disegno in relazione alla composizione e la vista gerarchia.

+0

Considerare l'uso di 'zIndex' – onmyway133

risposta

5

Il disegno si verifica al di sotto di tutte le sottoview di un UIView. Pensa che si trova proprio sulla base - una parte reale della tua vista - e quindi ogni sottoview viene aggiunta in cima alla tua vista. Per rendere il disegno sopra le sottoview è come se volessimo che le subviews appaiano sotto la vista, pur essendo ancora sotto-videate. Forse questa analogia rende più chiaro il motivo per cui deve essere sempre sul fondo. E ti porta anche logicamente alla soluzione:

Per far apparire il disegno sopra le sottoview, è sufficiente creare una nuova sottoclasse UIView per posizionare il codice del disegno all'interno e posizionarlo sopra tutte le altre sottoview.

Potrebbe anche essere una buona idea ignorare l'implementazione addSubview: di UIView, per garantire che la sottoview rimanga sempre in primo piano.

+0

Grazie. Domanda pazzesca a posteriori. Naturalmente il disegno deve obbedire alla gerarchia della vista. Cos'altro potrebbe fare? –

2

Credo che non sia possibile, dal momento che drawRect viene chiamato prima per la vista e al termine del disegno drawRect viene chiamato per le sottoview da disegnare su di esso. Forse basta fare un'altra sottocategoria in cima a quella vista che ha i confini di cui hai bisogno ed è trasparente ovunque?

2

Le sottovisioni sono drawn on top of their super views. Quindi la risposta alla tua domanda è no.

Nel momento in cui si disegna il bordo nella vista Contenitore, Cocoa non ha ancora iniziato a disegnare la barra degli strumenti.

Immagino che potresti rendere la parte superiore del bordo una sottoview o spostare la barra verso il basso un po '.