Xamarin.MacでCALayerにベジェ曲線を描画する方法です。
サンプルプロジェクトはこちら。
NSViewを継承したクラスを作成します。ICALayerDelegateも継承します。
public partial class SampleView : AppKit.NSView, ICALayerDelegate
{
}
CALayerのインスタンス変数を用意して、
private CALayer bgLayer;
コンストラクタが呼ばれたときに、Layer Backed Viewにします。
bgLayer = new CALayer();
this.Layer = bgLayer;
this.WantsLayer = true;
this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;
this.Layer.Delegate = this;
必要に応じて、Layout()でレイアウトの設定をします。
public override void Layout()
{
base.Layout();
this.Layer.Frame = this.Frame;
}
DrawLayer()で描画処理を行います。
[Export("drawLayer:inContext:")]
public void DrawLayer(CALayer layer, CoreGraphics.CGContext context)
{
NSGraphicsContext.GlobalSaveGraphicsState();
NSGraphicsContext graphicsContext = NSGraphicsContext.FromGraphicsPort(context, true);
NSGraphicsContext.CurrentContext = graphicsContext;
NSBezierPath path = new NSBezierPath();
//ベジェ曲線
var x1 = this.Frame.Left;
var y1 = this.Frame.Top;
var x2 = this.Frame.Right;
var y2 = this.Frame.Bottom;
path.MoveTo(new CoreGraphics.CGPoint(x1, y1));
path.CurveTo(new CoreGraphics.CGPoint(x2, y1),
new CoreGraphics.CGPoint(x1, y2),
new CoreGraphics.CGPoint(x2, y2));
//背景は白
NSColor.White.Set();
path.Fill();
//線は青
NSColor.Blue.Set();
//線の太さ
path.LineWidth = 2;
path.Stroke();
NSGraphicsContext.GlobalRestoreGraphicsState();
}