2009-09-17 11 views
23

Ho un UIView che contiene una riga di sottoclassi di UIView. La sottoclasse ha sostituito drawRect e ha impostato contentMode = UIViewContentModeRedraw.Come si impone il ridisegno (drawRect) di una subView quando cambia le dimensioni?

Come l'utente schiaccia e allunga il contenitore padre lo squash child views e allunga. Quando si verifica la modifica della forma, mi piacerebbe avere drawRect chiamato più volte per modificare il contenuto dello child views. Finora non ho avuto successo. Qual è il modo corretto per farlo?

Cheers,

Doug

risposta

57

in Cocoa, raramente (se non mai) chiamano drawRect - basta marcare la regione o vista come necessitano di aggiornamento, e saranno programmate per ridisegnare. Ciò consente di ridisporre insieme più invalidi.

Per Cocoa Touch, si vuole sia [view setNeedsDisplay], o setNeedsDisplayinRect:(CGRect)

+1

Ho provato a fare esattamente questo. Nessun effetto. Nuthin. nella sottoclasse che escludeva il setTransform: metodo di questa convenzione: - (void) setTransform: (CGAffineTransform) newValue { [super setTransform: newValue]; [self setNeedsDisplay]; } – dugla

+0

Apparentemente, un po 'di codice che vince ora ha impostato l'attivazione di NEDSDisplay correttamente. – dugla

3

È necessario chiamare [vista setNeedsLayout], questo dovrebbe causare i subviews per ricevere un drawRect: chiamata se le modifiche del layout. Non ho ancora provato questo.

+0

Alcuni dicono 'setNeedsDisplay', alcuni dicono' setNeedsLayout' .. Quali sono le diverse implicazioni qui? – Sti

0

Questa soluzione è un po 'folle, ma ha un senso logico e ha un grande risultato visivo. Sto lavorando con un NSLayoutManager e un paio di NSTextContainer s, disponendo il testo in due colonne. Poiché sto utilizzando più contenitori di testo (e non sono sicuro di volere più UITextView), sto ignorando il metodo draw(rect: CGRect) di MyDrawingView: UIView.

Il problema è che l'utilizzo self.contentMode = .redraw si traduce ancora in qualche minore che si estende a rotazione - abbastanza significativo da essere un affare-breaker.

Ho notato che l'impostazione contentMode = .left o anche contentMode = .scaleAspectFit era vicino a ciò che volevo, in termini di rotazione perfetta dei pixel. Ma ovviamente, non ricevevo il richiamo dell'estrazione di cui avevo bisogno.

Così - ho overrode layoutSubviews(), acceso il contentMode-.scaleAspectFit, chiamato super.layoutSubviews(), e poi commutata indietro. : P

override func layoutSubviews() { 
    self.contentMode = .scaleAspectFit 

    super.layoutSubviews() 
    self.contentMode = .redraw 
} 

È ... perfetto.

Problemi correlati