【发布时间】:2016-08-01 15:03:39
【问题描述】:
我正在将一个 swift 库移植到 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()
{
//...
}
}
谢谢!
【问题讨论】:
标签: c# ios swift uibutton xamarin.ios