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
也负责其所有子视图。
我倾向于覆盖Bounds
和Frame
具体取决于我正在做什么以及该视图包含什么……根据父级,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事件?