繁体   English   中英

Xamarin.Forms等效于layoutSubviews是什么?

[英]What is the Xamarin.Forms equivalent of layoutSubviews?

我正在将大型iOS代码库移植到Xamarin.Forms应用程序。 我们有很多自定义视图,这些视图通过在-layoutSubviews进行计算来执行其布局逻辑。 如果我需要根据堆栈或网格布局重新解释这些计算,则代码库太大,无法及时移植。 我真正想要的是一个直接等效项,可以在其中将等效子视图添加到我们的视图中,而不必担心它们的去向,然后是一个当视图范围更改时调用的方法,可以在其中设置子视图的新边界。 然后,我可以直接移植我们现有的iOS代码。

Xamarin.Forms中是否有与-layoutSubviews等效的-layoutSubviews

我不确定layoutSubviews的表单是否等效,但是您正在谈论的计算可以在称为方法的内部完成:

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

您需要从ContentPage或Any Page继承以覆盖此方法。

您可以通过继承Xamarin.Forms.Layout类来创建自己的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));
}

您可以在此处阅读有关如何创建自定义布局的整个教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM