我正在尝试为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,但实际渲染器占用了页面的整个宽度。
事实上,无论我将宽度放在哪个值,都会被忽略,渲染器会占据整个页面。
这不错,这是无心的,这是困扰我的。 (或者我做错了什么?)
所以这里的问题是如何在我的自定义渲染中找到占据的宽度?
答案 0 :(得分:1)
它不是渲染器,而是占用空间的本机控件。渲染器正在执行它的工作,即保持本机控件与表单控件同步 - 其中包括l ayout parse requests。
要控制大小限制,我建议您使用表单WidthRequest
上的属性HeightRequest
或Element
来执行此操作。它会自动通过渲染器逐步显示到原始Control
。Frame
。
修改-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
}
}
}