Como forço o redesenho (drawrect) de uma subview quando muda de dimensões?
-
10-07-2019 - |
Pergunta
Eu tenho uma visão que contém uma fila de subclasses de UIView
. A subclasse substituiu drawRect
: e definiu contentMode = UIViewContentModeRedraw
.
À medida que o usuário esmaga e estica o contêiner pai, o child views
Squash e estique. À medida que a mudança de forma ocorre, eu gostaria de ter drawRect
chamado repetidamente para mudar o conteúdo do child views
. Até agora, não tenho êxito. Qual é a maneira correta de fazer isso?
Saúde,
Doug
Solução
No cacau, você raramente (se é que alguma vez) chama de Drawrect - basta marcar a região ou ver como precisar de atualização e ela será agendada para redesenhar. Isso permite que as redesenhas para que várias invalidações sejam recolhidas.
Para o toque de cacau, você quer Veja SetNeedsDisplay, ou SETNEEDSDISPLAYINRECT: (CGRECT)
Outras dicas
Você precisa ligar para o [View SetNeedsLayout], isso deve fazer com que as subviews recebam um drawrect: ligue se o layout for alterado. Eu não testei isso, no entanto.
Esta solução é um pouco louca, mas faz sentido lógico e tem um ótimo resultado visual. Estou trabalhando com um NSLayoutManager
e um casal NSTextContainer
S, colocando texto em duas colunas. Porque estou usando vários contêineres de texto (e não tenho certeza se quero vários UITextView
), Estou substituindo o draw(rect: CGRect)
método de MyDrawingView: UIView
.
O problema é que usar self.contentMode = .redraw
Ainda resulta em um pequeno alongamento na rotação-significativo o suficiente para ser um desperdício.
Eu notei aquela configuração contentMode = .left
, ou mesmo contentMode = .scaleAspectFit
estava próximo do que eu queria, em termos de rotação perfeita de pixels. Mas, obviamente, eu não estava recebendo a ligação que eu precisava.
Então-eu substitui layoutSubviews()
, mudou o contentMode
para .scaleAspectFit
, chamado super.layoutSubviews()
, e depois trocou de volta. : P
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
É perfeito.