1.アプリケーションクラス

int main(int argc, char **argv) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
return UIApplicationMain(argc, argv, [MyApp class]);
[pool release];
}

UIApplicationがアプリケーションのインスタンスとなる.
main文の中でallocされる.
2.アプリケーションクラスの実装
初期化は,アプリケーション起動後に呼ばれるメソッド,applicationDidFinishLaunchingに実装するのが良いようだ.

@implementation MyApp
- (void) applicationDidFinishLaunching: (id) unused {
// Get screen rect
CGRect  screenRect;
screenRect = [UIHardware fullScreenApplicationContentRect];
// Create window
UIWindow*   window;
window = [[UIWindow alloc] initWithContentRect:screenRect];
// Create text view
UITextView* textView = [[UITextView alloc] initWithFrame:[window bounds]];
[textView setText:@"Hello World?"];
// Set content view
[window setContentView:textView];
// Show window
[window orderFront:self];
[window makeKey:self];
[window _setHidden:NO];
}
@end

HelloWorldでは,applicationDidFinishLaunchingで,Windowを作成し,その上にUITextViewを作成し,Hello World?の文字列をセットしている.
3.ナビゲーションバー

20070926-01.png

iPhoneで特徴的な上部のバーをナビゲーションバーと呼ばれるらしい.
それもapplicationDidFinishLaunchingで実装する.
48は,ナビゲーションバーの高さだ.

// Make size
CGRect sizeTextView = CGRectMake(0, 48, 320, 480);
CGRect sizeNavigationBar = CGRectMake(0, 0, 320, 48);
// Set content view
textView_ = [[UITextView alloc] initWithFrame:sizeTextView];
[textView_ setText:@"Hello World?"];
[window_ setContentView:textView_];
// Make navigation var
UINavigationBar*bar = [[UINavigationBar alloc] initWithFrame:sizeNavigationBar];
[bar showButtonsWithLeftTitle:@"Take" rightTitle:@"Take" leftBack:NO];
[bar setBarStyle:5];
[bar setDelegate:self];
[window_ addSubview:bar];

ナビゲーションバーに割り当てられたボタンが押されたときのイベントは,delegateで処理する.
navigationBarメッセージを実装する.

- (void) navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button {
// Set Message
[textView_ setText:@"Push Navigation Bar Button."];
}

ボタンを押すと,textViewに文字列がセットされる.
ウマーーーーー.
4.スクリーンショット
お気づきだろうか?
上のスクリーンショットはどうとったのだろうか?
はい,スクリーンショット実装しました.
iPhone自体にsshでログインしてスクリーンショットを取るプログラムはあるのだが,ちょっとイヤ.
ということで,自分で作りたいなぁ・・・・と探していた.
昨日あたりにグダグダになりながら,CoreGraphicsあたりのライブラリを探し回り,見つけますた.スクリーンショット生成方法.
間違ってるところ多々の可能性もありますが,一応モメ.

CGRect   bounds = [UIHardware fullScreenApplicationContentRect];
CGImageRef image = [window_ createSnapshotWithRect: bounds];
char buff[512];
// Make file name
snprintf( buff, sizeof(buff), "/tmp/%d.png", (int)[[NSDate date] timeIntervalSince1970] );
CFStringRef path = CFStringCreateWithCString( nil, buff, kCFStringEncodingASCII );
CFURLRef url = CFURLCreateWithFileSystemPath( nil, path, kCFURLPOSIXPathStyle, 0 );
// Make kUTTypePNG -> public.png
CFStringRef type = CFStringCreateWithCString( nil, "public.png", kCFStringEncodingASCII );
size_t count = 1;
CFDictionaryRef options = NULL;
// Writing
CGImageDestinationRef dest = CGImageDestinationCreateWithURL(url, type, count, options);
CGImageDestinationAddImage(dest, image, NULL);
CGImageDestinationFinalize(dest);
// Release
CFRelease(dest);
CGImageRelease( image );
CFRelease( url );
CFRelease( type );

1970から数えたm秒?でファイル名をセットして,/tmpにファイルを作成しています.
結構面倒くさかったのが,CFStringCreateWithCStringでファイルの保存形式をセットするところ.この文字列定数には,CoreGraphics?の定数をそのまま入力できない.
そこで,ムリクリ入れてみた.動いた.結果オーライ.
よし!これで大体のプログラミングの道具は揃った!!
気がする.