なんとか Xamarin iOS のアプリ起動に成功したので、今度は円弧を描画してみます
円弧ぐらいなら Xamarin.Forms で描画できるのでは・・・と調べてみたらこれがない!
こういった場合各プラットフォーム固有の API を使うしかないようです
とりあえず Xamarin.Forms のプロジェクトで円弧を描画するコードを作ってみました
まずは Shared プロジェクトに手を入れます
/// <summary> /// 共有表示用 View /// </summary> public class CanvasView : ContentView { }
中身は空っぽですが ContentView を継承した CanvasView というクラスを Shared プロジェクトに追加します
/// <summary> /// アプリケーション共通クラス /// </summary> public class App { /// <summary> /// MainPage の取得 /// </summary> /// <returns>初期画面</returns> public static Page GetMainPage() { return new ContentPage() { Content = new CanvasView() { HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand, }, }; } }
次に App.cs を上記のように修正
縦横に拡張するようにして CanvasView を表示するようにしているだけです(なんで HorizontalAlign とか XAML に文言を合わせてくれないの!)
[assembly: ExportRenderer(typeof(CanvasView), typeof(CanvasViewRenderer))] namespace XamarinSample.iOS { /// <summary> /// 表示用 View の iOS 固有 Renderer /// </summary> public class CanvasViewRenderer : ViewRenderer<CanvasView, CanvasViewRenderer> { /// <summary> /// 描画処理 /// </summary> /// <param name="rect">描画範囲の矩形</param> public override void Draw(RectangleF rect) { base.Draw(rect); using (var gc = UIGraphics.GetCurrentContext()) { // 色の指定 gc.SetStrokeColorWithColor(UIColor.FromRGB(0xc0, 0xc0, 0xc0).CGColor); // 線幅の指定 gc.SetLineWidth(20f); // 円弧を追加 gc.AddArc( rect.Width / 2f, rect.Height / 2f, Math.Min(rect.Width, rect.Height) * 0.3f, 0f, Convert.ToSingle(270f * Math.PI / 180f), false); // 枠線描画 gc.StrokePath(); } } } }
あとは iOS プロジェクトに上記の CanvasViewRenderer を追加して完了
じょうずにかけました!
この Renderer クラスの内部では iOS 固有 API にアクセスできます
Xamarin.Forms と各プラットフォーム固有 API を組み合わせる方法はいくつかあるようですが、Renderer の仕組みを使うのが一番柔軟性があるのではないでしょうか
ただ、API のお作法は当然ながら Windows 系とは異なり、数値系が全部 float だったり角度がラジアンだったりちょっとめんどくさいです
メソッドにマウスオーバーしてもコメント記述がないのでこのあたりのお作法が全然わからないのも不便;