2016-09-13 33 views
1

我使用ContentView創建了一個Xamarin表單併爲Android創建了一個呈現器。現在我必須爲IOS創建一個渲染器。Xamarin表單 - IOS:如何檢測UIView大小已更改

在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); 

}

確實的UIView在IOS有類似方法重寫?我已經嘗試重寫Frame屬性並在Element.SizeChanged(w,h)中調用,但我會得到TargetInvocationException。

P.S. SizeChanged方法是我的自定義虛擬方法而不是android方法。

回答

1

覆蓋LayoutSubviews通常用於軌道大小調整事件作爲UIView也負責所有的子視圖。

我也傾向於覆蓋BoundsFrame取決於我在做什麼,這視圖包含...取決於父母,視圖的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: <uiviewresize_UIViewResizing: 0x79a6cc00; frame = (-50 -50; 100 100); layer = <CALayer: 0x78628230>>. 
LayoutSubViews requested: <uiviewresize_UIViewResizing: 0x79a6cc00; frame = (100 100; 100 100); layer = <CALayer: 0x78628230>> 
Frame changing: <uiviewresize_UIViewResizing: 0x79a6cc00; frame = (100 100; 100 100); layer = <CALayer: 0x78628230>>. 
LayoutSubViews requested: <uiviewresize_UIViewResizing: 0x79a6cc00; frame = (100 100; 200 200); layer = <CALayer: 0x78628230>> 
Bounds changing: <uiviewresize_UIViewResizing: 0x79a6cc00; frame = (100 100; 200 200); layer = <CALayer: 0x78628230>> 
LayoutSubViews requested: <uiviewresize_UIViewResizing: 0x79a6cc00; frame = (150 100; 100 200); layer = <CALayer: 0x78628230>> 

更多的信息,以便查閱本:Is there a UIView resize event?

+0

這一工程,但怎麼我知道什麼時候該動畫結束。它看起來像多次調用 – LittleFunny

+0

@Simon動畫有完成塊,可用於在動畫結束時執行代碼。 – SushiHangover

+0

您的意思是AnimateWillStop方法 – LittleFunny