Xamarin.iOS テンプレート(Single View App)
1 Xamarinによる3種類のアプローチ
Xamarinを利用してモバイルアプリを開発する場合、そのアプローチとして、大きく次のような3つのものがあります。
- Xamarin.iOS
- Xamarin.Android
- Xamarin.Forms
上記のうち最初の2つは、名前のとおり、iOS 及び、Andorid用のアプリを作成するためのものです。 そしてそれは、それぞれのプラトフォーム固有の機能や、UIをC#で薄くラッパーしたものとなっています。
ここで、「薄くラッパー」と表現しているのは、元々のライブラリの名前空間やクラス名などを可能な限り忠実になぞり、文法、コーディング規約などをC#に合わせたものとなっている事を言っています。
このため、iOSのエンジニアであれば、「Xamarin.iOS」が、そして、Androidエンジニアであれば「Xamarin.Android」が、比較的、違和感なく読めると思います。 そして、どちらのプラットフォームにも経験が無い方でも、C#開発者であれば、ライブラリがC#であることから、極めて低いハードルで入門できるものになっています。
注) Xamarin.Formsは、前出の2つと大きく違い、まったく固有のライブラリとなっています。
今回は、Xamarin.iOSのシンプルなプロジェクトを通じて、この「薄いラッパー」を実感していただければと考えています。
2 テンプレート(Single View App)
VisualStudioでプロジェクトを作成する際に、「Single View App(iPhone)」を選択すると下記の構造のプロジェクトが生成されます。
(1)Main.cs
プログラム起動時のエントリーポイントとなるMain関数が定義されており、アプリケーションデリゲートにAppDelegateクラスが指定されています。
Main.cs
public class Application { static void Main(string[] args) { UIApplication.Main(args, null, "AppDelegate"); } }
(2)AddDelegate.cs
アプリ起動後やバックグラウンドに移動する際などの処理を記述するクラスです。 プロジェクトのテンプレートで生成されるひな形では、下記の4つのメソッドだけがオーバーライドされていますが、中身は何も定義されいません。
AddDelegate.cs
[Register("AppDelegate")] public partial class AppDelegate : UIApplicationDelegate { public override UIWindow Window { get; set; } //アプリがアクティブでなくなる直前に呼び出される public override void OnResignActivation(UIApplication application) { } //アプリがバックグラウンドになった時、呼び出される public override void DidEnterBackground(UIApplication application) { } //アプリがバックグラウンドからフォアグラウンドになる直前に呼ばれる public override void WillEnterForeground(UIApplication application) { } //アプリがバックグラウンド中に終了されるとき呼び出される public override void WillTerminate(UIApplication application) { } }
このほかのイベントを処理する場合は、メソッドをオーバーライドすることで利用可能です。
(3)MainStoryboard.storyboard
ストーリーボードのファイルであり、Info.plistの「Main Interface」でこのファイル名が指定されているため、アプリの起動時にインスタンス化されることになります。
ダブルクリックすると、何も乗っていないまっさらなビューが1つだけ置かれたビューコントローラーが表示されます。また、併せて「表示(V)」-「その他のウインドウ(E)」から「ドキュメント アウトライン(T)」を表示すると、その階層構造を分かりやすく確認することができます。
一番トップとなっているViewControllerを選択してプロパティを確認すると、Classのところが「RootViewController」となっており、これが次に解説するビューコントローラーのクラスとなっています。
(4)RootViewController.cs
ビューコントローラーのクラス定義です。 下記のメソッドが、オーバーライドされていますが、こちらも当初何も記述されていません。
RootViewController.cs
public partial class RootViewController : UIViewController { public RootViewController(IntPtr handle) : base(handle) {} //メモリ不足時に呼び出される public override void DidReceiveMemoryWarning() { base.DidReceiveMemoryWarning(); } //初回ロードされた時のみ呼び出される public override void ViewDidLoad() { base.ViewDidLoad(); } //画面が表示される都度呼び出される public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); } //画面が表示された後に呼び出される public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); } //画面が閉じる前に呼び出される public override void ViewWillDisappear(bool animated) { base.ViewWillDisappear(animated); } //画面が閉じた後に呼び出される public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); } }
2 UIViewだけのアプリ
(1)UIViewのクラス定義
UIViewだけの単純なアプリが、よく入門書に紹介されていますが、このUIViewは、本テンプレートにおいては、先の「ドキュメント アウトライン」で見えていた、Viewの事です。
しかし、プロパティのClassのところが空欄になっていますので、基底クラスであるUIViewでインスタンス化され、ソースコードは無いことになります。 このClassのところにクラス名を入力すると、自動的にソースファイルが生成され、ソリューションエクスプローラに表示されるようになります。
(2)文字列表示
入門でよく最初に紹介されている、draw()を使用したビューへの文字列描画は、Xamarinでは次のようになります。
MyView.cs
partial class MyView : UIView { public MyView(IntPtr handle) : base(handle) { } public override void Draw(CGRect rect) { base.Draw(rect); var str = new NSString("Developers.IO"); str.DrawString(new CGPoint(75, 60), UIFont.FromName("HiraKakuProN-W3", 24f)); } }
まとめ
今回は、XamarinのiPhone用テンプレートから、SingleViewAppを使用した最もシンプルなアプリを作成することで、その構造を概観しました。 もし、既にObjective-CやSwiftでiOSを開発されている方でしたら、「C#である」ということを除けば、ほとんど違和感がなかったのでは無いでしょうか。
サンプルコード(http://github.com/furuya02/Xamarin.iOS.Samples)
参考リンク
初めての Xamarin.iOS アプリケーション開発 - 入門ガイド