2016-08-01 10 views
1

Ich portiere zu Xamarin.IOS eine schnelle Bibliothek, die einige Material-Design-Animation mit UIButton macht.Wie überschreiben LayoutSublayersOfLayer Verhalten von Xamarin.IOS UIButton?

Das Swift-Gegenstück ist eine Unterklasse von UIButton und überschreibt layoutSublayersOfLayer.

Swift:

public override func layoutSublayersOfLayer(layer: CALayer) { 
    super.layoutSublayersOfLayer(layer) 
    if self.layer == layer { 
     layoutShape() 
     layoutVisualLayer() 
    } 
} 

Auf Xamarin Seite habe ich festgestellt, dass diese Methode durch CALayerDelegate genannt wird, die mit CALayer durch de Eigenschaft Delegate zugeordnet ist. Ich habe versucht, CALayerDelegate abzuleiten und de Delegate-Eigenschaft zu ersetzen, aber wenn ich das tat, wurde die Schaltfläche nicht korrekt gerendert und gestoppt reagieren auf Ereignisse.

Gibt es eine Möglichkeit, LayoutSublayersOfLayer auf Xamarin.Ios zu überschreiben? Gibt es eine andere Methode, die ich überschreiben kann, um Dinge vorzubereiten, bevor eine bestimmte Ebene gezeichnet wird?

public class MaterialButtonLayerDelegate : CALayerDelegate 
{ 

    private readonly MaterialButton _button; 

    public MaterialButtonLayerDelegate(MaterialButton button):base() 
    { 
     _button = button; 
    } 

    public override void LayoutSublayersOfLayer(CALayer layer) 
    { 
     if (_button.Layer == layer) 
     { 
      _button.LayoutShape(); 
      _button.LayoutVisualLayer(); 
     } 
    } 
} 

[Register("MaterialButton")] 
public class MaterialButton : UIButton 
{ 
    public CAShapeLayer VisualLayer { get; private set; } = new CAShapeLayer(); 

    public MaterialButton(CGRect frame):base(frame) 
    { 
     PrepareView(); 
    } 

    protected void PrepareView() 
    { 
     Layer.Delegate = new MaterialButtonLayerDelegate(this); 

     ContentScaleFactor = MaterialDevice.Scale(); 
     PrepareVisualLayer(); 
    } 

    protected virtual void PrepareVisualLayer() 
    { 
     VisualLayer.ZPosition = 0; 
     VisualLayer.MasksToBounds = true; 
     Layer.AddSublayer(VisualLayer); 
    } 

    protected virtual void LayoutShape() 
    { 
     //... 
    } 

    protected virtual void LayoutVisualLayer() 
    { 
     //... 
    } 
} 

Vielen Dank!

Antwort

0

Die einzige Möglichkeit, dies zu tun, ist die CALayerDelegate-Klasse zu erweitern und als CAShapeLayer-Delegat festzulegen. Achten Sie darauf, die Basismitglieder der Delegierten wo immer möglich anzurufen, da sie die erforderlichen Bindungen hinter den Kulissen ausführen.

public override void LayoutSublayersOfLayer(CALayer layer) 
{ 
    base.LayoutSublayersOfLayer(layer); 

    if (_button.Layer == layer) 
    { 
     _button.LayoutShape(); 
     _button.LayoutVisualLayer(); 
    } 
}