ラベル iPhone の投稿を表示しています。 すべての投稿を表示
ラベル iPhone の投稿を表示しています。 すべての投稿を表示

2009年12月4日金曜日

hidesBottomBarWhenPushed は viewDidLoad で呼んだら遅い。

UIViewController の hidesBottomBarWhenPushed というプロパティは、navigationController の Push機能で画面遷移した時に、画面下部のタブバーであったり、ツールバーであったりを隠すかどうかという設定を出来るプロパティ。UIViewController.tabBarController.tabBar というプロパティに変換をかけて、無理矢理この効果と同様の効果を作る事も出来るけど、デメテルの掟に反しているし、非常に煩雑になる事は目に見えているので、出来れば、ちゃんとこのプロパティを使いたいところ。しかし、このプロパティは他の多くの UIViewController のプロパティと違って、viewDidLoad メソッドの中で呼んでも効果が出ない。で、どうすれば良いかというと、単に init系のメソッドの中で設定しておけば、期待した効果が得られる模様。(たとえば、-initWithNibName:bundle: など)



参考したつぶやき:
http://favotter.matope.com/status.php?id=4000286651


UIViewController.hidesBottomBarWhenPushed はナビゲーションにプッシュする前に設定しておかないと効果ないんだなぁ。自分の viewDidLoad で設定してもダメ。考えて見りゃそうかもしれないけど、最初分からなかった。

2009年11月25日水曜日

cocoa の sqlite3 wrapper library

FMDB というライブラリが、良さそう。ドキュメントが無いけど、かなり分かりやすい使用感で、単に SQL を書いたら、欲しい結果が Cocoa らしいインターフェースで返ってくるという感じで、非常に簡単/便利。


追記:FMDatabase クラスの -executeQuery: メソッドでプレースホルダーに数値を入れたい時は、NSInteger 型ではなくて、NSNumber 型で置く必要がある。あと、プレースホルダーを指定する場合は、NSArray のコンストラクタのように、最後に nil を置いてあげる必要がある。


例えば、i が NSInteger で来ているとして、



FMResultSet rs;
rs = [db executeQuery:"select * from secrets where id = ?", [NSNumber numberWithInt:i], nil];

と、呼ぶ必要がある。

2009年11月6日金曜日

マイ・アニメーションブロック

iPhone アプリ開発で、起動時にスプラッシュスクリーンを入れたいときとか、細かいアニメーションをたくさん入れたい時に、自分用のアニメーションブロックみたいなのを作ると、コードが読みやすくなるし、タイプ量も減って、コードがメンテナンスしやすくなる。


- (void)animDur:(float)dur next:(SEL)sel {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:dur];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:sel];
}

- (void)anim {
[UIView commitAnimations];
}

- (void)sleepDur:(float)dur next:(SEL)next {
[NSTimer
scheduledTimerWithTimeInterval:dur
target:self selector:next userInfo:nil repeats:NO];
}

- (void)splash0 {
[self animDur:0.4 next:@selector(splash1)];
splash.alpha = 1;
[self anim];
}
- (void)splash1 {
[self sleepDur:1.5 next:@selector(splash2)];
}

- (void)splash2 {
[self animDur:1.0 next:@selector(splash3)];
splash.alpha = 0;
[self anim];
}

- (void)splash3 {
[self animDur:1.0 next:nil];
mainView.alpha = 1;
[self anim];
}

2009年10月23日金曜日

iPhone アプリ内からメーラーを起動するワンライナー


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:jacques@example.com"]];


iPhone アプリ内から、メールを出させたい時に。

2009年10月22日木曜日

UIPickerView のドラムを止めるイディオム


[picker selectRow:[picker selectedRowInComponent:n] inComponent:n animated:No];

UIPickerView はドラム式の選択肢インプットを自動で作ってくれる便利な UIKit コンポーネントだけど、ちょっと困るのが、勝手にドラムの慣性を処理してくれているせいで、値の選択に微妙なタイムラグがあるのが、ちょっと面倒。(ユーザー視点で言えば、それが気持ちいい訳だけど、・・・)たとえば、ドラムを目一杯勢いを付けた状態で、即決定ボタンにタッチみたいな操作をされると、picker から取得した値と picker の状態に齟齬が生じて、思わぬバグが混入したりする可能性がある。(しかも、そういう操作のテストが面倒。)そういうバグを防ぐ為に、picker の値を取得する際に、強制的に picker を止める上のイディオムが結構有効だと思う。

2009年10月18日日曜日

UINavigationBar の挙動が邪悪な件

Cocoa Touch フレームワークの UIKit の UINavigationBar の挙動が邪悪(=非論理的)な気がする。

View hierarchy を無視して、親ビューのサイズとかオフセットを無視して、
勝手な位置に固定サイズで勝手に表示される。どうにかコントロールできないものか・・・