Come forzare il ridisegno (drawRect) di un SubView quando cambia dimensioni?
-
10-07-2019 - |
Domanda
Ho un UIView che contiene una riga di sottoclassi di UIView
. La sottoclasse ha sostituito drawRect
: e ha impostato contentMode = UIViewContentModeRedraw
.
Mentre l'utente schiaccia e allunga il contenitore padre, viste figlio
si schiaccia e si allunga. Quando si verifica il cambio di forma, vorrei che drawRect
venisse ripetutamente chiamato per modificare il contenuto di viste figlio
. Finora non ho avuto successo. Qual è il modo corretto per farlo?
Saluti,
Doug
Soluzione
In Cocoa, raramente (se mai) chiami drawRect: contrassegni semplicemente la regione o visualizzi come aggiornamento che sarà pianificato per il ridisegno. Ciò consente di ridimensionare insieme ridisegni per più invalidazioni.
Per Cocoa Touch, vuoi [visualizza setNeedsDisplay] o setNeedsDisplayinRect: (CGRect)
Altri suggerimenti
Devi chiamare [view setNeedsLayout], questo dovrebbe far sì che le viste secondarie ricevano un drawRect: chiama se il layout cambia. Non l'ho provato, tuttavia.
Questa soluzione è un po 'folle, ma ha un senso logico e ha un ottimo risultato visivo. Sto lavorando con un NSLayoutManager
e un paio di NSTextContainer
, disponendo il testo in due colonne. Poiché sto usando più contenitori di testo (e non sono sicuro di volere più UITextView
), sto sovrascrivendo il metodo draw (rect: CGRect)
di MyDrawingView: UIView
.
Il problema è che l'uso di self.contentMode = .redraw
comporta comunque un lieve allungamento della rotazione - abbastanza significativo da essere un affare.
Ho notato che l'impostazione contentMode = .left
, o anche contentMode = .scaleAspectFit
era vicino a quello che volevo, in termini di rotazione perfetta dei pixel. Ma ovviamente, non stavo ricevendo il call di cui avevo bisogno.
Quindi - ho scavalcato layoutSubviews ()
, ho cambiato contentMode
in .scaleAspectFit
, chiamato super.layoutSubviews ()
, quindi ripristinato. : P
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
È ... perfetto.