繁体   English   中英

如何覆盖Xamarin.IOS UIButton的LayoutSublayersOfLayer行为?

[英]How to override LayoutSublayersOfLayer behavior of Xamarin.IOS UIButton?

我正在移植到Xamarin.IOS一个快速的库,用UIButton制作一些材料设计动画。

swift对应物是UIButton的子类,并覆盖layoutSublayersOfLayer。

迅速:

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

在Xamarin方面,我注意到这个方法是通过CALayerDelegate调用的,它通过de property Delegate与CALayer相关联。 我尝试子类CALayerDelegate并替换de Delegate属性,但是当我这样做时,按钮没有正确呈现并停止响应事件。

有没有办法在Xamarin.Ios上覆盖layoutSublayersOfLayer? 在绘制特定图层之前,是否有其他方法可以覆盖以准备内容?

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()
    {
        //...
    }
}

谢谢!

唯一可行的方法是扩展CALayerDelegate类并将其设置为CAShapeLayer委托。 请务必尽可能调用委托的基本成员,因为它在幕后执行所需的绑定。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM