创建一个使用CAGradientLayer作为层的UIView子类

本文关键字:子类 UIView CAGradientLayer 一个 创建 | 更新日期: 2023-09-27 18:29:54

我想将其移植到C#。

我不知道该如何转换:

@property (nonatomic, strong, readonly) CAGradientLayer *layer;

layer是UIView的默认图层。Xamarin已经具有Layer属性。如何覆盖此内容?我需要覆盖它吗?

我也试过

public CAGradientLayer layer { [Export ("Layer")] get; [Export ("Layer:")] set; }

但是如果我想设置层的颜色,应用程序会崩溃(System.Reflection.TargetInvocationException-在单元出列时出现NullReferenceException)。此外,它应该是只读的。

然后我在文档中看到了如何转换:

public class BlueView : UIView
{
    [Export ("layerClass")]
    public static Class GetLayerClass ()
    {
        return new Class (typeof (BlueLayer));
    }
    public override void Draw (RectangleF rect)
    {
        // Do nothing, the Layer will do all the drawing
    }
}
public class BlueLayer : CALayer
{
    public override void DrawInContext (CGContext ctx)
    {
        ctx.SetFillColor (0, 0, 1, 1);
        ctx.FillRect (Bounds);
    }
}

这对我没有帮助,因为我需要SetFillColors这样我才能使用CGColor[]数组。但没有这样的功能。

如何在C#中使用MonotTouch使用自定义CAGradientLayer创建UIView

创建一个使用CAGradientLayer作为层的UIView子类

这篇精彩的文章(iOS编程配方20:在自定义视图中使用CAGradientLayer)为我指明了正确的方向:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.CoreAnimation;
using MonoTouch.CoreGraphics;
using MonoTouch.ObjCRuntime;
namespace SampleApp
{
    public class GradientView : UIView
    {
//      public new CAGradientLayer Layer { get; private set; }
        private CAGradientLayer gradientLayer {
            get { return (CAGradientLayer)this.Layer; }
        }
        public GradientView ()
        {
        }

        [Export ("layerClass")]
        public static Class LayerClass ()
        {
            return new Class (typeof(CAGradientLayer));
        }
        public void setColors(CGColor[] colors){
            this.gradientLayer.Colors = colors;
        }
//      public override void Draw (RectangleF rect)
//      {
//          // Do nothing, the Layer will do all the drawing
//      }
    }
}

在这里,我创建并设置了我的背景视图:

GradientView background = new GradientView ();
background.setColors (new CGColor[] {
    UIColor.FromRGB (18,200,45).CGColor,
    UIColor.White.CGColor,
    UIColor.White.CGColor
});

现在它似乎奏效了。使用一个自定义属性(包含强制转换)和一个单独的方法达到了目的。当然,您可以编写完整的访问器。这是一个简单的测试。

您可以这样使用。无需为其创建单独的类。

 var gradient = new CAGradientLayer();
 gradient.Frame = new CoreGraphics.CGRect(0,0, width, height);
 gradient.Colors = new CoreGraphics.CGColor[] { UIColor.Clear.CGColor, 
                    UIColor.SystemBackgroundColor.CGColor };
  Layer.AddSublayer(gradient);