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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top