Agora, o Interface Builder permite que o usuário altere dinamicamente o tamanho de todos os controladores de visualização no storyboard, para simular o tamanho de um determinado dispositivo.
Antes desta funcionalidade, o usuário deve definir manualmente cada tamanho do controlador de visualização. Portanto, o controlador de visualização foi salvo com um certo tamanho, que foi usado initWithCoder
para definir o quadro inicial.
Agora, parece que initWithCoder
não use o tamanho definido no storyboard, e defina um tamanho de 1000x1000 px para a visualização do controlador de visualização e todas as suas subvisualizações.
Isso não é um problema, porque as visualizações devem sempre usar uma destas soluções de layout:
autolayout, e todas as restrições farão o layout correto de suas visualizações
autoresizingMask, que fará o layout de cada visualização que não tenha nenhuma restrição anexada ( observe que o autolayout e as restrições de margem agora são compatíveis na mesma visualização \ o /! )
Mas isso é um problema para todas as coisas de layout relacionadas à camada de visualização, como cornerRadius
, desde que nem autolayout nem máscara de redimensionamento automático se aplicam às propriedades da camada.
Para responder a esse problema, a maneira comum é usar viewDidLayoutSubviews
se você estiver no controlador ou layoutSubview
em uma visualização. Neste ponto (não se esqueça de chamar seus super
métodos relativos), você tem certeza de que todas as coisas de layout foram feitas!
Tem certeza? Hum ... não totalmente, eu observei, e é por isso que fiz essa pergunta, em alguns casos a visualização ainda tem seu tamanho 1000x1000 neste método. Acho que não há resposta para minha própria pergunta. Para dar o máximo de informações sobre isso:
1- acontece apenas no layout das células! Em UITableViewCell
& UICollectionViewCell
subclasses, layoutSubview
não será chamado depois que as subvisualizações forem dispostas corretamente.
2- Como @EugenDimboiu comentou (por favor, vote a favor da resposta se for útil para você), chamar [myView layoutIfNeeded]
a subvisão sem layout irá exibi-la corretamente na hora certa.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- Na minha opinião, esse é definitivamente um bug. Enviei-o ao radar (id 28562874).
PS: Não sou inglês nativo, então fique à vontade para editar minha postagem se minha gramática precisar ser corrigida;)
PS2: Se você tiver alguma solução melhor, fique à vontade para não escrever outra resposta. Vou mover a resposta aceita.