i'm porting xamarin.ios swift library makes material design animation uibutton.
the swift counterpart subclass of uibutton , overrides layoutsublayersoflayer.
swift:
public override func layoutsublayersoflayer(layer: calayer) { super.layoutsublayersoflayer(layer) if self.layer == layer { layoutshape() layoutvisuallayer() } }
on xamarin side noted method called through calayerdelegate, associated calayer through de property delegate. tried subclass calayerdelegate , replace de delegate property, when did button didn't rendered correctly , stopped respond events.
is there way override layoutsublayersoflayer on xamarin.ios ? there method can override prepare stuff before particular layer drawn ?
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() { //... } }
thanks!
the possible way extending calayerdelegate class , setting cashapelayer delegate. sure call delegate's base members wherever possible performs required bindings behind scenes.
public override void layoutsublayersoflayer(calayer layer) { base.layoutsublayersoflayer(layer); if (_button.layer == layer) { _button.layoutshape(); _button.layoutvisuallayer(); } }
Comments
Post a Comment