Muitos desenvolvedores iOS não pensam sobre como funciona o mecanismo de renderização de elementos, configuração e atualização de restrições no Auto Layout'e. Neste artigo, tento examinar em detalhes o interior do Layout Engine.
A passagem de layout
Passe o Layout de - é onde o Auto Layout Engine ignora a hierarquia de conceitos, mas causa o método ViewWillLayoutSubviews em todos os métodos viewController e layoutSubviews para todas as visualizações . O método layoutSubviews atualiza a propriedade Frame de cada subvisualização
Quando adicionamos, alteramos ou excluímos restrições, elas não são atualizadas imediatamente. Seria ineficiente recalcular o layout e atualizar a renderização a cada alteração . Em vez disso, suas alterações estão programando o mecanismo de layout pertencente à janela para acionar atualizações de layout na próxima oportunidade no runloop.
Um ciclo de layout típico consiste em várias etapas:
Gatilho: você está alterando a entrada no mecanismo de layout. Isso pode ser adicionar ou remover subvisualizações, alterar o tamanho do conteúdo interno, ativar / desativar restrições ou alterar a prioridade ou restrição constante.
Update Model: layout engine view , views. the layout engine view.
. Views, , setNeedsLayout() superview, layout pass runloop.
Deferred Layout Pass: the layout pass view hierarchy. constraints. , , layoutSubviews() view, subviews, , views .
, viewController, view layout engine :
layout engine updateViewConstraints, view updateConstraints.
the layout pass layout engine viewWillLayoutSubviews viewDidLayoutSubviews , layoutSubviews layout
Constraints
view hierarchy , constraint' , layout engine views. updateConstraintsIfNeeded view, constraints. view, constraints, layout engine updateConstraints, . setNeedsUpdateConstraints, . , the layout engine , updateConstraintsIfNeeded.
Views
- view. the layout engine view frames .
, layout, layoutSubviews () subviews layout engine.
setNeedsLayout layoutIfNeeded, layout pass view. , layout pass view :
setNeedsLayout: layout. layout view layout pass application run loop.
layoutIfNeeded: layoutSubviews , , layout engine subviews
:
, constraints . the layout engine , .
. constraints. view layout, , the layout engine.
setNeedsLayout, layout'a. layoutIfNeeded view frames .