iPhoneアプリについて
iPhoneSDKで配信されているサンプルコードMoveMeについての解説の概要。元ページはhttp://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.actionです。しっかり翻訳したわけでないので、詰まったときは元のページを見てください。んで間違ってるところ見つけたら教えてください。
=================================================================================
iPhoneアプリをつくるにあたって、まずmain関数で全体の初期化を行う必要がある。そのときに記述するコードは下記のようになる。
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @"MoveMeAppDelegate"); [pool release]; return retVal; }
まず、autorelease用のpoolを作成する。これはスレッドを使うときも同様である。注意しなければならないのはUIApplicationMainの部分だ。アプリケーションのDelegateを引数とするがこれを間違えると元も子もない。このデリゲーションはUIApplicationと連携をとり、状態を変化させる。主な処理は下記の様になる。
・アプリケーションウィンドウと初期UIを作成
・自作のデータエンジンに必要な初期化タスクを行う
・自作URLスキームに関連した内容を開く
・デバイスの位置の変化に反応する
・低メモリの警告を扱う
・アプリケーション終了の要求を扱う
アプリケーションウィンドウの作成
ウィンドウはUIのための描画面を提供するが、ビューオブジェクトは実際の内容を持つ。そのビューオブジェクトとはUIViewのインスタンスである。MoveMeではMyViewとPlacardViewくらすがUIを扱う。アプリケーションが立ち上がり終わるとUIApplicationがapplicationDidFinishLaunchingメッセージを委譲する。このときに行われるのは
・新しいUIWindowオブジェクトを作成。そのフレームサイズはスクリーンのサイズにあわせる。
・バックグラウンドでの動作と全画面のフレームを埋めるためにMyViewの新しいインスタンスを作成。
・Welcomeボタンとして動作させるためのPlacardViewのインスタンスを作成。配置はバックグラウンドビューの中央。
・ウィンドウの表示
MoveMeでは下記の様に書かれている
- (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Set up content view to fill screen contentView = [[MyView alloc] initWithFrame:[window bounds]]; // Set up and show window [window addSubview:contentView]; [window makeKeyAndVisible]; }
ここではスクリーン全体をUIScreenから得て、新しいUIwindowオブジェクトの初期化のために使う。ここではメンバー変数windowがそれで、デリゲートにもなっている。そのあとウィンドウのためのメインコンテンツを作成、可視化する。ウィンドウの表示はシステムにアプリケーションが準備できたことを知らせる。
PlacardViewクラスの生成はinitWithFrame:で行われる。これはMyViewがアプリケーションのバックグラウンドを提供し、それがPlacardViewをサブビューとして追加するからだ。この二つのビューの関係はWelcomeボタンがアプリケーションバックグラウンドのトップに表示されるといった効果だけではなくMyViewにボタンを対象としたイベント処理を許すという結果も引き出す。
initWithFrameは下記のように書かれている。
- initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor darkGrayColor]; // Create the placard view -- it calculates its own frame based on its image placardView = [[PlacardView alloc] init]; placardView.center = self.center; [self addSubview:placardView]; } return self; }
*UIImageViewは画像表示に用いられる。