Xamarin表单iOS渲染器尺寸

时间:2017-10-06 11:51:42

标签: xamarin.forms

我正在尝试为iOS创建一个“通用”渲染器,但我无法确定渲染器的尺寸。

PCL中渲染器的类非常简单,唯一的“奇特”是继承自View,因为我想将它作为通用渲染器

public class ExampleView : View { }

在XAML中,它也是非常典型的

<renderers:ExampleView />

iOS项目中渲染器的定义如下

public class ExampleRenderer : ViewRenderer<ExampleView, UIView>
{
    protected override void OnElementChanged(ElementChangedEventArgs<ExampleView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            SetNativeControl(new UIView(new CGRect(0, 0, 0, 300)));
        }
    }
}

这里有趣的部分是该类继承自ViewRenderer<ExampleView, UIView>

似乎虽然我指定渲染的宽度为0,但实际渲染器占用了页面的整个宽度。

事实上,无论我将宽度放在哪个值,都会被忽略,渲染器会占据整个页面。

这不错,这是无心的,这是困扰我的。 (或者我做错了什么?)

所以这里的问题是如何在我的自定义渲染中找到占据的宽度?

1 个答案:

答案 0 :(得分:1)

它不是渲染器,而是占用空间的本机控件。渲染器正在执行它的工作,即保持本机控件与表单控件同步 - 其中包括l ayout parse requests

要控制大小限制,我建议您使用表单WidthRequest上的属性HeightRequestElement来执行此操作。它会自动通过渲染器逐步显示到原始ControlFrame

修改-1

如果要根据当前范围更新本机控件(或子视图),可以使用OnElementPropertyChanged跟踪更改。导致大小更新的原因有很多,例如设备方向更改,父布局,第一次布局传递等。

public class ExampleRenderer : ViewRenderer<ExampleView, UIView>
{
    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == VisualElement.WidthProperty.PropertyName ||
            e.PropertyName == VisualElement.HeightProperty.PropertyName)
        {
            if(Element != null && Element.Bounds.Height > 0 && Element.Bounds.Width > 0)
            {
                //update size on native control's subviews
                // or use SetNeedsDisplay() to re-draw
                //Note: force update to Control's size is not recommended (as it is recommended it be same as forms element)
                //Instead add a subview that you can update for size here
            }   
        }
    }