O Layout Engine em Swift

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:





  1. 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.





  2. Update Model: layout engine view , views. the layout engine view.



    . Views, , setNeedsLayout() superview, layout pass runloop.





  3. 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 .












All Articles