¿Cómo fuerzo el redibujo (drawRect) de una subvista cuando cambia las dimensiones?
-
10-07-2019 - |
Pregunta
Tengo una UIView que contiene una fila de subclases de UIView
. La subclase ha anulado drawRect
: y ha establecido contentMode = UIViewContentModeRedraw
.
A medida que el usuario aprieta y estira el contenedor principal, la vista secundaria
aplasta y estira. A medida que se produce el cambio de forma, me gustaría que se llame a drawRect
repetidamente para cambiar el contenido de las vistas secundarias
. Hasta ahora no he tenido éxito. ¿Cuál es la forma correcta de hacer esto?
Saludos,
Doug
Solución
En Cocoa, rara vez (si alguna vez) llama a drawRect: solo marca la región o la vista como si necesitara actualización, y se programará para volver a dibujar. Esto permite volver a dibujar para que múltiples invalidaciones se contraigan juntas.
Para Cocoa Touch, desea [ver setNeedsDisplay] o setNeedsDisplayinRect: (CGRect)
Otros consejos
Debe llamar a [view setNeedsLayout], esto debería hacer que las subvistas reciban un drawRect: llame si el diseño cambia. Sin embargo, no he probado esto.
Esta solución es un poco loca, pero tiene sentido lógico y tiene un excelente resultado visual. Estoy trabajando con un NSLayoutManager
y un par de NSTextContainer
s, diseñando el texto en dos columnas. Debido a que estoy usando múltiples contenedores de texto (y no estoy seguro de querer múltiples UITextView
), estoy anulando el método draw (rect: CGRect)
de MyDrawingView: UIView
.
El problema es que el uso de self.contentMode = .redraw
todavía produce algunos estiramientos menores en la rotación, lo suficientemente significativo como para ser un factor decisivo.
Noté que configurar 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.
Entonces, anulé layoutSubviews ()
, cambié el contentMode
a .scaleAspectFit
, llamado super.layoutSubviews ()
, y luego lo volvió a cambiar. : P
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
Es ... perfecto.