Layouting in iOS

The layouting cycle (measure and arrange) in Uno on iOS is a mingling of native layouting logic and logic in managed code. These interactions are summarized in the diagram below. This information is primarily intended to help when debugging Uno, but may also be useful when attempting to incorporate non-Uno views into the visual tree.

Arrange Phase
Measure Phase
Measure Invalidation
for child elements
Subelement measuring
on parent element
for child elements
schedule for next loop (native)
internal scheduling for next loop (native)
legend
Uno methods
Native (iOS) methods
Application/Framework implementation
Layouter.Arrange(finalRect)
FrameworkElement.ArrangeOverride(finalSize)
.Frame property set
Framework.ArrangeElement(child)
layouter.arrangeelement
(override) ArrangeOverride(finalSize)
layouter.arrangechild
layouter.arrangechildoverride
(override) FrameworkElement.SizeThatFits(availableSize)
FrameworkElement.XamlMeasure(availableSize)
Layouter.Measure(availableSize)
Layouter.MeasureOverride(availableSize)
FrameworkELement.MeasureOverride(availableSize)
overridden by element
local implementation of MeasureOverride(availableSize)
(override) FrameworkElement.LayoutSubviews()
FrameworkElement.MeasureElement(child)
Layouter.MeasureElement(child)
Layouter.MeasureChildOverride
UIElement.InvalidateArrange()
IFrameworkElementHelper.InvalidateMeasure()
(override) FrameworkElement.SetNeedsLayout()
FrameworkElement.SetSuperviewNeedsLayout()
.SizeThatFits() called from parent element
base.SetNeedsLayout()
CALayer.LayoutSublayers