Hatena::Groupiphone-dev

伊勢的iPhone

2010/07/05(Mon)

UINavigationController の view をviewにaddSubViewすると不幸になる

| 01:00 | はてなブックマーク - UINavigationController の view をviewにaddSubViewすると不幸になる - 伊勢的iPhone

時たま、こんなサンプルを見ますが、これってとってもトラブルの原因になってしまいます。

// 
- (void) viewDidLoad {
    // Interface Builder で Navigation Controller を別定義してあって、
    // File's Owner の View Controller の view にその view を突っ込もうとする
    [self.view addSubView:navControl.view];
}

たとえばこんな良くないことが・・・・

  • Navigation Controller ステータスバー分だけ下にずれる
  • UITableViewにUITextField入れても自動でサイズが変わってくれない(キーボードがせりあがって描画領域が減った分だけ縮むのが正しい)
  • Navigation Controller に View Controller を push しても viewWillAppear とかのビュー遷移のイベントが発生しない

これで1年半くらい悩んでました・・・orz

2010/09/27(Mon) 追記

これ、結局どうすればいいかわからんっていわれてたので、僕はこうしたという話を。

NavigationController 自体、またはその継承クラスを presentModalViewController で表示させるのがひとまず正しそうで、Interface Builderを使わずに以下のように継承クラスを作成。

// SettingViewController.h
@interface SettingViewController : UINavigationController {
@private
	MainSettingPageViewController* mainPage;
}

- (id) initWithSettingRootViewController;

- (void) dismiss;
@end

// SettingViewController.m
@implementation SettingViewController
@synthesize mainPage;

- (id) initWithSettingRootViewController {
	// Setup MainPage (RootView)
	return [self initWithRootViewController:[[MainSettingPageViewController alloc] initWithOwner:self]];
}

- (void) dismiss {
	[self dismissModalViewControllerAnimated:YES];
}

@end

そしてあとはこいつをインスタンス化してpresentModalViewControllerで表示。

[self presentModalViewController:[SettingViewTestAppDelegate appDelegate].settingController animated:YES];

「そういえばUINavigationControllerもUIViewControllerの派生クラスだよなー」と思って試してみたらうまくいきました。

Image I/O で GPS 位置情報を書き込む(iOS4 feature)

| 00:51 | はてなブックマーク - Image I/O で GPS 位置情報を書き込む(iOS4 feature) - 伊勢的iPhone

lastImage に UIImage が、lastLocation に CLLocation が入っています。

	CGImageSourceRef img = CGImageSourceCreateWithData((CFDataRef)UIImageJPEGRepresentation(lastImage, 0.7), NULL);
	NSMutableDictionary* exifDict = [[[NSMutableDictionary alloc] init] autorelease];
	NSMutableDictionary* locDict = [[[NSMutableDictionary alloc] init] autorelease];
	NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
	[dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];
	NSString* datetime = [dateFormatter stringFromDate:lastLocation.timestamp];
	[exifDict setObject:datetime forKey:(NSString*)kCGImagePropertyExifDateTimeOriginal];
	[exifDict setObject:datetime forKey:(NSString*)kCGImagePropertyExifDateTimeDigitized];
	[locDict setObject:lastLocation.timestamp forKey:(NSString*)kCGImagePropertyGPSTimeStamp];
	if (lastLocation.coordinate.latitude <0.0){ 
		[locDict setObject:@"S" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
	}else{ 
		[locDict setObject:@"N" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
	} 
	[locDict setObject:[NSNumber numberWithFloat:lastLocation.coordinate.latitude] forKey:(NSString*)kCGImagePropertyGPSLatitude];
	if (lastLocation.coordinate.longitude <0.0){ 
		[locDict setObject:@"W" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef];
	}else{ 
		[locDict setObject:@"E" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef];
	} 
	[locDict setObject:[NSNumber numberWithFloat:lastLocation.coordinate.longitude] forKey:(NSString*)kCGImagePropertyGPSLongitude];
	NSMutableData* imageData = [[[NSMutableData alloc] init] autorelease];
	CGImageDestinationRef dest = CGImageDestinationCreateWithData((CFMutableDataRef)imageData, CGImageSourceGetType(img), 1, NULL);
	CGImageDestinationAddImageFromSource(dest, img, 0, 
										 (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:
														   locDict, (NSString*)kCGImagePropertyGPSDictionary,
														   exifDict, (NSString*)kCGImagePropertyExifDictionary, nil]);
	CGImageDestinationFinalize(dest);
	CFRelease(img);
	CFRelease(dest);

ootas5ecootas5ec2010/07/06 13:46こういう情報ってどうしてなかなか検索しても引っかからないんでしょうかね。
splitViewControllerはmodal表示できないとか、検索してもなかなか出てこなかったんですよね...

goldfishbowlgoldfishbowl2010/09/28 17:54呟いた者です。ご親切にありがとうございました!!

2009/12/06(Sun)

MonoTouch/.NETCFなiPhone/WMクロス開発のプロジェクトの準備

| 01:54 | はてなブックマーク - MonoTouch/.NETCFなiPhone/WMクロス開発のプロジェクトの準備 - 伊勢的iPhone

ちゃんとした記事にするまでのメモ。

  • VS2008起動、新規ソリューション作成
  • クラスライブラリプロジェクトを追加。名前は Hoge.Common とか。
  • おもむろに2つのプロジェクトをソリューションから削除する
    • VS2008でのプロジェクトに対する削除はXcodeでいう「参照の削除」になる。
  • プロジェクトのファイル名をいじる
  • VS2008でソリューションにプロジェクトファイルを追加し直す
  • ソリューションを閉じる
  • ソリューションの名前の末尾に_WMをつける。(Hoge_WM.sln)
  • MonoDevelopにうつる。新規ソリューションの作成
    • iPhone MonoTouch Project」を作成。VS2008で最初つくったものとあわせる。
  • 「MonoTouch Library Project」を追加。名前は Hoge.Common とか。
  • おもむろに2つのプロジェクトをソリューションから削除する
    • 削除するときに「[-]削除」のほうを選択。「[ゴミ箱]削除」は物理削除なので。
  • プロジェクトのファイル名をいじる
  • VS2008でソリューションにプロジェクトファイルを追加し直す
  • ソリューションを閉じる
  • ソリューションの名前の末尾に_iPhoneをつける。(Hoge_iPhone.sln)
  • それぞれで開いて、アプリケーションのプロジェクトからCommonのプロジェクトを、すべてのプロジェクトからプラットフォームにあったRumCustardのプロジェクトを参照する

2009/11/07(Sat)

UITableViewを使うときのテンプレ

| 11:20 | はてなブックマーク - UITableViewを使うときのテンプレ - 伊勢的iPhone

UITableView はあまりの面倒くささに毎回やる気なくなるし、着手しても発狂するのでテンプレ化。MonoTouch で UITableView を使うときのサンプルとしてもどうぞ。

ちなみに、このクラスには Interface Builder で UITableView おいて、コントローラに tableView という名前で結合してあります。

ここまでかいておけばあとは overrde[space] で MonoDevelop が実装できるメソッドを教えてくれるのでちょっと気が楽。



2009/10/21(Wed)

キーボードの開閉イベントの取得、キーボードの大きさを得る

| 09:31 | はてなブックマーク - キーボードの開閉イベントの取得、キーボードの大きさを得る - 伊勢的iPhone

Objective-C


- (void) initKeyboardEvent {
	[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
}

// キーボードオープンイベント
- (void) keyboardWillShow:(NSNotification*)notif {
	// キーボードの大きさを取得
	NSDictionary* info = [notif userInfo];
	NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
	CGRect keyboardRect = [aValue CGRectValue];
}


C# on MonoTouch


private void KeyboardInit() {
	m_keybordWillShowNotificationObj = NSNotificationCenter.DefaultCenter.AddObserver("UIKeyboardWillShowNotification", KeyboardOpen);
}

private void KeyboardWillOpen(NSNotification notification) {
	NSDictionary dict = notification.UserInfo;
	NSValue val = dict.ObjectForKey(UIKeyboard.BoundsUserInfoKey);
	RectangleF rect = val.RectangleFValue;
}

2009/06/25(Thu)

Apple Push Notification Service の配信サーバー側をC#でかく場合

00:35 | はてなブックマーク - Apple Push Notification Service の配信サーバー側をC#でかく場合 - 伊勢的iPhone

まだ調べてる最中だけど、だいたいこんな感じ。

Macでする作業

  • Mac側で証明書の発行依頼作成、証明書の発行、証明書のcerファイルをダウンロード、発行した証明書のキーチェーンへの登録までやってしまう。
  • 秘密鍵個人情報交換(p12)ファイルへ出力する

Windowsの設定

プログラミング

  • SocketでApple Push Notification Service のサーバーへ繋いで、NetworkStreamにラップして、さらに SslStream にラップする。
  • SslStream.AuthenticateAsClient (String, X509CertificateCollection, SslProtocols, Boolean) で認証する。
    • X509CertificateCollection には、発行した証明書を X509Certificate.CreateFromCertFile(String)でcerファイルから読み込んで証明書をコレクションに入れたもの使用する
    • SslProtocols は、TLSを設定する。
    • 最後は、開発中は false、運用中は true でいいんじゃないかな?