2016-08-08 61 views
1

我將大型iOS代碼庫移植到Xamarin.Forms應用程序中。我們有很多自定義視圖,它們通過在-layoutSubviews中進行計算來執行其佈局邏輯。如果我需要根據堆棧或網格佈局重新解釋這些計算,那麼代碼庫對於我來說太大以至於無法及時移植。我真正想要的是直接等價的,我可以將等價的子視圖添加到我們的視圖中,而不用擔心它們到了哪裏,然後當視圖的邊界發生變化時調用一個方法,我可以設置子視圖的新邊界。然後我可以直接移植我們現有的iOS代碼。什麼是layoutsubviews的Xamarin.Forms等價物?

在Xamarin.Forms中是否有一些等效的-layoutSubviews

回答

1

您可以通過派生自Xamarin.Forms.Layout類來創建自己的佈局。

public class CustomLayout : Layout<View> 
{ 
    public CustomLayout() 
    { 

    } 
} 

該佈局必須覆蓋LayoutChildren方法。這種方法負責在屏幕上定位兒童。

通過使用GetSizeRequest方法可以測量孩子,該方法將返回孩子所需的期望大小和最小大小。

protected override void LayoutChildren (double x, double y, double width, double height) 
{ 
    for (int i = 0; i < Children.Count; i++) { 
     var child = (View) Children[i]; 
     // skip invisible children 

     if(!child.IsVisible) 
      continue; 
     var childSizeRequest = child.GetSizeRequest (double.PositiveInfinity, height); 
     var childWidth = childSizeRequest.Request.Width; 
     LayoutChildIntoBoundingRegion (child, new Rectangle (x, y, childWidth, height)); 
     x += childWidth; 
    } 
} 

無論何時需要重新計算佈局,都會自動調用此方法。如果您的佈局由硬編碼或固定大小的元素組成,請將其大小硬編碼到此算法中,而不是測量。 GetSizeRequest調用是可以進行的一些最昂貴的調用,並且在運行時不可預測,因爲子樹可能是任意複雜的。如果不需要動態調整大小,固定其大小是獲得性能提升的好方法。

實現OnSizeRequest是必需的,以確保新佈局放置在其他佈局內時的尺寸正確。在佈局週期期間,根據上面的佈局,可能會多次調用此方法,並需要多少佈局異常才能解析當前佈局分層結構。

protected override SizeRequest OnSizeRequest (double widthConstraint, double heightConstraint) 
{ 
    var height = 0; 
    var minHeight = 0; 
    var width = 0; 
    var minWidth = 0; 

    for (int i = 0; i < Children.Count; i++) { 
     var child = (View) Children[i]; 
     // skip invisible children 

     if(!child.IsVisible) 
      continue; 
     var childSizeRequest = child.GetSizeRequest (double.PositiveInfinity, height); 
     height = Math.Max (height, childSizeRequest.Minimum.Height); 
     minHeight = Math.Max (minHeight, childSizeRequest.Minimum.Height); 
     width += childSizeRequest.Request.Width; 
     minWidth += childSizeRequest.Minimum.Width; 
    } 

    return new SizeRequest (new Size (width, height), new Size (minWidth, minHeight)); 
} 

您可以閱讀如何創建自定義佈局here的全部教程。

1

我不知道是否有在layoutSubviews形成了一個等效的,但是,你正在談論可以在調用的方法內部完成的計算:

protected override void OnSizeAllocated(double width, double height) 
{ 
    base.OnSizeAllocated(width, height); 
} 

您需要從ContentPage或任何繼承頁面覆蓋此方法。

相關問題