본문 바로가기
프로그래밍/App 개발

[Xamarin] Custom Layout

by 엽기토기 2020. 10. 21.
반응형

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