Xamarin表单 – IOS:如何检测UIView大小已更改

我使用ContentView创建了一个Xamarin表单,并为Android创建了一个渲染器。 现在我必须为IOS创建一个渲染器。

在android渲染器中,我可以覆盖onSizeChanged并将这些宽度/高度值传递给自定义xamarin-form视图。

protected override void OnSizeChanged(int w, int h, int oldw, int oldh) { base.OnSizeChanged(w,h, oldw, old); Element.SizChanged(w,h); 

}

IOS中的UIView是否有类似的方法来覆盖? 我试过覆盖Frame属性并在Element.SizeChanged(w,h)中调用,但我会得到TargetInvocationException。

PS SizeChanged方法是我的自定义虚方法而不是android方法。

覆盖LayoutSubviews通常用于跟踪resize事件,因为UIView也负责其所有子视图。

我倾向于覆盖BoundsFrame具体取决于我正在做什么以及该视图包含什么……根据父级,View的LayoutSubviews可以被调用很多…

假设一个UIView子类如:

 public class UIViewResizing : UIView { public UIViewResizing() { } public UIViewResizing(CGRect frame) : base(frame) { } public UIViewResizing(NSCoder coder) : base(coder) { } public override CGRect Bounds { get { return base.Bounds; } set { if (value != base.Bounds) { Console.WriteLine($"Bounds changing: {this}"); } base.Bounds = value; } } public override CGRect Frame { get { return base.Frame; } set { if (value != base.Frame) { Console.WriteLine($"Frame changing: {this}."); } base.Frame = value; } } public override void LayoutSubviews() { Console.WriteLine($"LayoutSubViews requested: {this}"); base.LayoutSubviews(); } } 

行使它:

 var view = new UIViewResizing(new CGRect(100, 100, 100, 100)); view.BackgroundColor = UIColor.Red; Add(view); await Task.Delay(2500); view.Frame = new CGRect(100, 100, 200, 200); await Task.Delay(2500); view.Bounds = new CGRect(20, 20, 100, 200); 

结果是:

 Frame changing: >. LayoutSubViews requested: > Frame changing: >. LayoutSubViews requested: > Bounds changing: > LayoutSubViews requested: > 

有关其他信息,请参阅此SO: 是否有UIViewresize事件?