2009-09-17 14 views
23

Tengo una UIView que contiene una fila de subclases de UIView. La subclase ha anulado drawRect: y ha establecido contentMode = UIViewContentModeRedraw.¿Cómo fuerzo el redibujado (drawRect) de una Subvista cuando cambia las dimensiones?

A medida que el usuario aplasta y estira el contenedor principal, el child views aplasta y estira. A medida que se produce el cambio de forma, me gustaría tener drawRect llamado repetidamente para cambiar el contenido del child views. Hasta ahora no he tenido éxito. ¿Cuál es la forma correcta de hacer esto?

Saludos,

Doug

Respuesta

57

en el cacao, que rara vez (o nunca) llaman drawRect - que acaba de marcar la región o ver como la necesidad de actualizar y que se programarán para volver a dibujar. Esto permite que los rediseños para invalidaciones múltiples se colapsen juntos.

Para Cocoa Touch, que desea ya sea [view setNeedsDisplay], o setNeedsDisplayinRect:(CGRect)

+1

Intenté hacer exactamente eso. Sin efecto. Nuthin. En la subclase I pesaban más que las setTransform: método de esta manera: - (void) setTransform: (CGAffineTransform) newValue { [SUPER setTransform: newValue]; [self setNeedsDisplay]; } – dugla

+0

Aparentemente, un bit de código pasivo ahora ha configurado la activación deNeedsDisplay correctamente. – dugla

3

Es necesario llamar [Ver setNeedsLayout], esto debería hacer que los subvistas para recibir una drawRect: llamar si los cambios de diseño. No he probado esto, sin embargo.

+0

Algunos dicen 'setNeedsDisplay', algunos dicen' setNeedsLayout' .. ¿Cuáles son las diferentes implicaciones aquí? – Sti

0

Esta solución es un poco loca, pero tiene sentido lógico y tiene un gran resultado visual. Estoy trabajando con un NSLayoutManager y un par de NSTextContainer s, presentando el texto en dos columnas. Debido a que estoy usando varios contenedores de texto (y no estoy seguro de querer el número UITextView), estoy anulando el método draw(rect: CGRect) de MyDrawingView: UIView.

El problema es que el uso de self.contentMode = .redraw todavía resulta en un pequeño estiramiento en la rotación, lo suficientemente importante como para romper el reparto.

Me di cuenta de que la configuración contentMode = .left, o incluso contentMode = .scaleAspectFit estaba cerca de lo que quería, en términos de rotación de píxeles perfectos. Pero, obviamente, no recibía la llamada de sorteo que necesitaba.

Por lo tanto - me hicieron caso omiso layoutSubviews(), cambiaron la contentMode-.scaleAspectFit, llamados super.layoutSubviews(), y luego cambió de nuevo. : P

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

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

Es ... perfecto.

Cuestiones relacionadas