引っ越しました。

このブログは引っ越しました。
今後は引越し先で更新を続けます。
新しいブログではソースコードにシンタックスカラーを付けているので見やすくなっていると思います。

こちらは数ヶ月後に削除しますのでよろしくお願いします。

2010年6月28日月曜日

ModalViewにNavigationControllerを追加する方法

ブログ移行しました。
新しいブログでのこの記事は ModalViewにNavigationControllerを追加する方法 こちらです。
シンタックスカラーなど導入しているのでソースコードが見やすくなっているはずなので是非っ。


通常のモーダルは
ModalView* dialog = [[[ModalView alloc] init] autorelease];
dialog.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:dialog animated:YES];
でモーダルに推移する。
このモーダルにナビゲーションバーを追加表示する。
方法は超簡単。
ModalView* dialog = [[[ModalView alloc] init] autorelease];
dialog.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
UINavigationController *NavigationController =
[[UINavigationController alloc] initWithRootViewController:dialog];
[self presentModalViewController:NavigationController animated:YES];
以上でおk。
あとはバーのカスタマイズでボタンを色々追加すると良いよ。

っていうかUINavigationControllerにモーダルビューだろうとラベルビューだろうと突っ込んでおけばとりあえずナビゲーションバーは表示されるはず。
…はず。

UIGestureRecognizerまとめ?

ブログ移行しました。
新しいブログでのこの記事はUIGestureRecognizerまとめ?こちらです。
シンタックスカラーなど導入しているのでソースコードが見やすくなっているはずなので是非っ。

OS3.2以降のOSで対応。
つまりiPadかiOS4が入ったiPhoneじゃないと動かない。
でも涙が出るくらい便利。

UITapGestureRecognizer : タップ(タップの数は任意で取得)
UIPinchGestureRecognizer : ピンチインとピンチアウト(拡大縮小用。二本指でくぱぁするアレ)
UIPanGestureRecognizer : パニング(ドラッグのこと)
UISwipeGestureRecognizer : スワイプ(ページ送りなど。ドラッグと似てる?)
UIRotationGestureRecognizer : 回転(指二本での回転)
UILongPressGestureRecognizer : 長押し(safariの新規タブを開くときに使うなど)

使い方は簡単。
タップの場合はUITapGestureRecognizerのインスタンスを作成してactionで動作したときに飛ぶ関数の指定。
あとはnumberOfTapsRequiredでタップの回数を指定。
ビューに追加して終わり。

以下ソース。
これはダブルタップの場合です。
UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DetectionDoubleTap:)];
tapRec.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:tapRec];
[tapRec release];
んで後はタップ判定後に飛ぶ実際の処理をする関数を作るだけ。
- (void)DetectionDoubleTap:(id)sender {
NSLog(@"DoubleTap!");
}
これでおk。

独自のUIをUIViewで作ったものにも簡単にタップやジェスチャを実装できるのはいいね。

ちなみにScrollView上に追加したUIButtonとどっちが優先されるかやってみた。
結果的にはタップ回数が1回の判定時はUIGestureRecognizerが優先されました。
ダブルタップ時はボタンが優先されました。
まぁダブルタップはともかくシングルタップ時はUIGestureRecognizerが優先されるみたいです。

2010年6月25日金曜日

iphone The bundle identifier cannot be changed from the previous minor version.の解決ヒント

iphone The bundle identifier cannot be changed from the previous minor version.
はその名の通りbundle identifierが原因。

このエラーが出たらとりあえずバイナリ(アプリ本体)のアップロードは後にして他のを進める。
バイナリ以外をアップロードしたらWaiting For Upload状態になるはず。
この時アプリ管理画面にApp Detailsの項目があるはずなのでそのリンクをクリックするとBundle Identifierという項目がある。
とりあえずその横に表記されてる文をコピー。
xcodeを開いてplistを開く。
Bundle Identifierの項目にさっきコピーした文をペースト。
その状態でアップロード。
私はその状態で無事完了しました。

2010年6月23日水曜日

iPhoneのUiKitの表示サイズ

それぞれ高さが
ナビゲーションバー 44px
タブバー 48px
ステータスバー 20px
残り 368px

2010年6月21日月曜日

画像のメモリ削減管理

複数の、それも大量の画像を扱う場合の話。
メモリ的に効率のよい管理、なのでUIImageViewにすべての画像を読み込んでaddSubViewで表示、はもちろん却下。
UIImageviewは数個に抑えておく。

もっと効率のよいやり方はあるだろうけど自分の場合は下記の方法でやりました。
NSString  *imageName = [NSString stringWithFormat: @"img" ];
NSString  *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
UIImage* img = [[UIImage alloc] initWithContentsOfFile:imagePath];
UIImageView* viewImage = [[[UIImageView alloc] initWithImage:img] autorelease];
初期化は上記の方法でおk。
※以前公開していたコードはミスがあったので修正しました。

処理の途中での画像の差し替えは下記の方法。
viewImage.image = nil;
NSString *imageName = [NSString stringWithFormat: @"img2"];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
img = [[UIImage alloc] initWithContentsOfFile:imagePath];
viewImage.image = img;
viewImage.contentMode = UIViewContentModeScaleAspectFill;
[img release];
とすればOK。
contentModeは画像を差し替えても初回に読み込んだアスペクト比で画像を表示してしまうので色々なアスペクト比のものを扱う場合はここでリセットしておく。
プロパティの値はここを参照。
http://d.hatena.ne.jp/rnamiki/20090226/1235667228

複数のviewを扱う場合は表示する(画面に写る)画像以外はhiddenプロパティをオフにしておく。
これで大体はおkなんじゃないかなぁ。

参考サイト
iPhone 開発 画像ロード方法3種まとめ