반응형
Layout
Methods
Layout.OnMeasure(Double, Double) (필수)
protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint)
⇒ Layout의 SizeRequest를 리턴. 이 메서드를 호출하면, Layout 주기의 pass를 측정하는 것을 시작한다.
Return
- SizeRequest
SizeRequest는 minimium Size와 Maximum Size (requested)를 정의하는 구조체.
Parameters
- widthConstraint
부모 레이아웃이 자식에게 할당 가능한 폭
- heightConstraint
부모 레이아웃이 자식에게 할당 가능한 높이
Layout.LayoutChildren(Double, Double, Double, Double) (필수)
protected abstract void LayoutChildren (double x, double y, double width, double height);
⇒ Layout의 Children의 위치와 크기를 정하는 메서드
Example Code
protected override void LayoutChildren(double x, double y, double width, double height) { // 모든 child 하나씩 진행 foreach (Xamarin.Forms.View child in Children) { // invisible children은 건너뜀 if (!child.IsVisible) continue; // Child의 요청 크기를 받아옴 SizeRequest childSizeRequest = child.Measure(width, Double.PositiveInfinity, MeasureFlags.IncludeMargins); // Child의 위치와 크기를 초기화 double xChild = x; double yChild = y; double childWidth = childSizeRequest.Request.Width; double childHeight = childSizeRequest.Request.Height; // HorizontalOptions의 위치와 크기를 적용시킴 switch (child.HorizontalOptions.Alignment) { case LayoutAlignment.Start: break; case LayoutAlignment.Center: xChild += (width - childWidth) / 2; break; case LayoutAlignment.End: xChild += (width - childWidth); break; case LayoutAlignment.Fill: childWidth = width; break; } // Child를 layout. child.Layout(new Rectangle(xChild, yChild, childWidth, childHeight)); // 다음 Child의 수직 위치를 계산. y += childHeight; } }
Layout.LayoutChildIntoBoundingRegion(VisualElement, Rectangle)
public static void LayoutChildIntoBoundingRegion (Xamarin.Forms.VisualElement child, Xamarin.Forms.Rectangle region);
⇒ Child의 HorizontalOptions 및 VerticalOptions를 고려하면서 Child element를 경계 영역에 배치.
- 이 메서드는 각 Child의 일반 영역이 계산 된 후, Layout 주기에서 호출됨.
- 주어진 경계 영역이, Child가 원하는 크기보다 큰 경우, 주어진 경계 영역에 상대적인 element 위치를 다룬다.
Example Code
foreach (View child in Children) { if (!child.IsVisible) { continue; } // layoutData.CellSize 계산이 선행되어야 함. LayoutChildIntoBoundingRegion(child, new Rectangle(new Point(xChild, yChild), layoutData.CellSize)); if (++column == layoutData.Columns) { column = 0; row++; xChild = x; yChild += RowSpacing + layoutData.CellSize.Height; } else { xChild += ColumnSpacing + layoutData.CellSize.Width; } }
Layout.InvalidateLayout
protected virtual void InvalidateLayout ();
protected override void InvalidateLayout()
{
base.InvalidateLayout();
}
⇒ 현재 Layout을 invalidate한다. 새로운 Layout 주기를 트리거함.
Layout<View>
여러 Children을 사용하는 동작이 정의되지 않은 기본 레이아웃
Methods
protected virtual void OnAdded (T view);
protected override void OnChildAdded (Xamarin.Forms.Element child);
⇒Child가 추가될 때
protected virtual void OnRemoved (T view);
protected override void OnChildRemoved (Xamarin.Forms.Element child);
⇒Child가 제거 될 때
반응형
'프로그래밍 > App 개발' 카테고리의 다른 글
[Xamarin] CollectionView Selected Item Color (0) | 2020.11.24 |
---|---|
[Xamarin] Custom Bottom Sheet (0) | 2020.10.22 |
[Xamarin] SearchBar (0) | 2020.10.20 |
[Xamarin] Messaging Center (0) | 2020.10.20 |
[Xamarin] UIModalPresentationStyle (0) | 2020.10.20 |
Uploaded by Notion2Tistory v1.0.0