gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:31:53 27 4
gpt4 key购买 nike

我正在将一个快速库移植到 Xamarin.IOS,它使用 UIButton 制作一些 Material 设计动画。

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

swift :

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 委托(delegate)。请务必尽可能调用委托(delegate)的基本成员,因为它会在幕后执行所需的绑定(bind)。

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

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

关于c# - 如何覆盖 Xamarin.IOS UIButton 的 LayoutSublayersOfLayer 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38702181/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com