[英]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.