Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

tokoromのその他の日記

2010-01-31

UITabBarControllerの"その他"画面と"配置変更"画面のbarStyleの変更

| 13:05 |  UITabBarControllerの"その他"画面と"配置変更"画面のbarStyleの変更 - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  UITabBarControllerの"その他"画面と"配置変更"画面のbarStyleの変更 - iPhoneアプリ開発まっしぐら★  UITabBarControllerの"その他"画面と"配置変更"画面のbarStyleの変更 - iPhoneアプリ開発まっしぐら★ のブックマークコメント

UIKit本追加/補足 > UIKit本の内容自体への補足/訂正 > UITabBarControllerの"その他"と"配置変更画面"のbarStyleの変更


UITabBarControllerを利用する際に表示される「その他」画面に表示されるナビゲーションバーの色は、UITabBarControllerのnavigationBar.barStyleを変更しても変わることはない。

f:id:tokorom:20100131130209p:image

このナビゲーションバーの色を変更するには、以下のようにUITabBarControllerのmoreNavigationControllerプロパティのnavigationBar.barStyleを変更する必要がある。

// selfはUITabBarControllerのインスタンス
self.moreNavigationController.navigationBar.barStyle = UIBarStyleBlack;

これにより、その他画面のナビゲーションバーの色が変更される。

f:id:tokorom:20100131130330p:image

ただ、これで安心してはいけない。

これだけだと、その他画面の[編集]ボタンをタップしたときに遷移する配置変更画面のナビゲーションバーまでは変更されないのだ。

f:id:tokorom:20100131130331p:image

ここも変更したい場合、UITabBarControllerDelegateのtabBarController:willBeginCustomizingViewControllers:メソッドを以下のように実装する。

// tabBarControllerのdelegateにselfが設定されていること
// self自体がUITabBarControllerのインスタンスなら self.delegate = self;
- (void)tabBarController:(UITabBarController*)tabBarController
  willBeginCustomizingViewControllers:(NSArray*)viewControllers
{
  UIView* subviews = [tabBarController.view.subviews objectAtIndex:1];
  UINavigationBar* navigationBar = [[subviews subviews] objectAtIndex:0];
  navigationBar.barStyle = UIBarStyleBlack;
}

これで、その他画面と配置変更画面の両方のナビゲーションバーの色が変更されたはずだ。

f:id:tokorom:20100131130332p:image


■参考URL: http://blog.noizeramp.com/2009/08/06/iphone-black-navigation-bar-in-more-view/

2010-01-13

UIImageとNSDataの相互変換

| 04:47 |  UIImageとNSDataの相互変換 - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  UIImageとNSDataの相互変換 - iPhoneアプリ開発まっしぐら★  UIImageとNSDataの相互変換 - iPhoneアプリ開発まっしぐら★ のブックマークコメント

UIKit本追加/補足 > UIKit本の内容自体への補足/訂正 > UIImageとNSDataの相互変換


UIKit本の Unit5.4 でUIImageが登場するが、ここではUIImageのimageNamed:メソッドを使ってファイルからUIImageを作成する方法しか紹介できていない。

しかし他にも、NSURLConnectionを使ってWebからダウンロードした画像ファイルをUIImageとして使いたい場合など、NSDataからUIImageを作りたいことがよくあるだろう。

まず、これにはUIImageをinitWithData:メソッドで初期化すればよい。

// receivedDataをWebから取得した画像のバイナリデータ(NSData)とする
// ここではわかりやすいようにいったん代入する
NSData* data = receivedData;
// initWithData:メソッドでNSDataを元にUIImageを初期化できる
UIImage* image = [[[UIImage alloc] initWithData:data] autorelease];

また、逆にUIImageの画像データをNSDataとして抽出するにはUIImagePNGRepresentation関数が使える。

// UIImagePNGRepresentation関数によりUIImageが保持する画像データをPNG形式で抽出可能
NSData* pngData = [[[NSData alloc] initWithData:UIImagePNGRepresentation( image )] autorelease];

代わりにUIImageJPEGRepresentation関数を使ってJPEGで抽出することもできる。

2010-01-10

UIKit本への追加コンテンツと補足情報をこちらに追加していきます

| 02:40 |  UIKit本への追加コンテンツと補足情報をこちらに追加していきます - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  UIKit本への追加コンテンツと補足情報をこちらに追加していきます - iPhoneアプリ開発まっしぐら★  UIKit本への追加コンテンツと補足情報をこちらに追加していきます - iPhoneアプリ開発まっしぐら★ のブックマークコメント

◆UIKit本 追加コンテンツ&補足情報◆

f:id:tokorom:20100111023538j:image

ここには「iPhoneプログラミングUIKit詳解リファレンス」に載せきれなかった情報や、補足/訂正情報を掲載していきます。


  • UIKit本の内容自体への補足/訂正は → コチラ

  • 追加コンテンツ【Objective-C 2.0 コーディング解説編】 → コチラ

  • 追加コンテンツ【データ管理クラス解説編】 → コチラ

UIKit本の内容自体への補足/訂正

| 02:49 |  UIKit本の内容自体への補足/訂正 - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  UIKit本の内容自体への補足/訂正 - iPhoneアプリ開発まっしぐら★  UIKit本の内容自体への補足/訂正 - iPhoneアプリ開発まっしぐら★ のブックマークコメント

UIKit本追加/補足 > UIKit本の内容自体への補足/訂正



ここには「iPhoneプログラミングUIKit詳解リファレンス」の内容自体への補足/訂正情報を掲載していきます。


  • Chapter 00 本書を読む前に
  • Chapter 01 Hello, UIKit!
  • Chapter 02 UIView徹底解説
  • Chapter 03 UIViewControllerと画面遷移
  • Chapter 04 フルスクリーンと画面の回転
  • Chapter 05 グラフィックス&アニメーション
  • Chapter 06 タッチ操作&モーション
  • Chapter 07 ユーザへの通知と意思確認
  • Chapter 08 テキストとWebの表示
  • Chapter 09 テーブル表示
  • Chapter 10 UI部品の利用
  • Chapter 11 アプリケーション&デバイス情報
  • Chapter 12 カメラ撮影&ムービー編集

画面遷移時に呼ばれるメソッドの補足

| 04:07 |  画面遷移時に呼ばれるメソッドの補足 - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  画面遷移時に呼ばれるメソッドの補足 - iPhoneアプリ開発まっしぐら★  画面遷移時に呼ばれるメソッドの補足 - iPhoneアプリ開発まっしぐら★ のブックマークコメント

UIKit本追加/補足 > UIKit本の内容自体への補足/訂正 > 画面遷移時に呼ばれるメソッドの補足


UIKit本の P.116 で、画面遷移時にUIViewControllerの状態監視用の各メソッドが、

  1. ■遷移先の画面のviewDidLoad(読み込み済みだった場合はこれを省く)
  2. ◇遷移元の画面のviewWillDisappear
  3. ■遷移先の画面のviewWillAppear
  4. ◇遷移元の画面のviewDidDisappear
  5. ■遷移先の画面のviewDidAppear

という順番でコールされると記載している。

f:id:tokorom:20100111043005p:image

しかし、これはUINavigationControllerのpushViewController:animated:メソッドによる画面遷移の場合の話だ。

これが、UIViewControllerのpresentModalViewController:animated:メソッドによる画面のモーダル表示の場合には少し変わってくる。

具体的には以下のとおりだ。

  1. ■遷移先の画面のviewDidLoad(読み込み済みだった場合はこれを省く)
  2. ■遷移先の画面のviewWillAppear
  3. ◇遷移元の画面のviewWillDisappear
  4. ■遷移先の画面のviewDidAppear
  5. ◇遷移元の画面のviewDidDisappear

このように、画面遷移時とモーダル表示時の場合にはこれらのメソッドがコールされるタイミングが変わってくるので注意が必要だ。

f:id:tokorom:20100111043006p:image

特に、

  1. 遷移元画面のviewWillDisappearで変数Aにnilを設定して
  2. 遷移先画面のviewWillAppearで変数Aにselfを設定する

というようなコードを書いて、変数Aにカレントの画面を常に代入するなんて処理になっているとまずいことが起こる。画面をモーダル表示する場合にはこれらのメソッドが呼ばれるタイミングが逆転するので、思いもよらず変数Aがnilになってしまうのだ。

いずれにせよ、場合によってviewWillAppear/viewWillDisappearの呼ばれる順番が変わってくる可能性があるということを頭の片隅に置いておいたほうが良さそうだ。

2010-01-06

1.1 NSString -文字列- 目次

| 01:59 |  1.1 NSString -文字列- 目次 - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  1.1 NSString -文字列- 目次 - iPhoneアプリ開発まっしぐら★  1.1 NSString -文字列- 目次 - iPhoneアプリ開発まっしぐら★ のブックマークコメント

UIKit本追加/補足 > データ管理クラス解説編 > 1.1 NSString -文字列-


    • 1.1.1 NSStringと文字列定数
    • 1.1.2 初期化 (準備中)
    • 1.1.3 文字列長の取得 (準備中)
    • 1.1.4 書式 (準備中)
    • 1.1.5 UNICHAR形式での文字列の抽出 (準備中)
    • 1.1.6 バイト配列の抽出 (準備中)
    • 1.1.7 C言語形式の文字列の抽出 (準備中)
    • 1.1.8 結合 (準備中)
    • 1.1.9 パディング (準備中)
    • 1.1.10 部分文字列の取得 (準備中)
    • 1.1.11 分割 (準備中)
    • 1.1.12 トリミング (準備中)
    • 1.1.13 シンプルな検索 (準備中)
    • 1.1.14 複雑な検索 (準備中)
    • 1.1.15 置換 (準備中)
    • 1.1.16 シンプルな比較 (準備中)
    • 1.1.17 複雑な比較 (準備中)
    • 1.1.18 大文字と小文字の変換 (準備中)
    • 1.1.19 数値への変換 (準備中)
    • 1.1.20 文字エンコーディング (準備中)
    • 1.1.21 ファイルへの保存と読み込み (準備中)
    • 1.1.22 パスの管理 (準備中)
    • 1.1.23 URLの管理 (準備中)

1.1.1 NSStringと文字列定数

| 02:31 |  1.1.1 NSStringと文字列定数 - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  1.1.1 NSStringと文字列定数 - iPhoneアプリ開発まっしぐら★  1.1.1 NSStringと文字列定数 - iPhoneアプリ開発まっしぐら★ のブックマークコメント

UIKit本追加/補足 > データ管理クラス解説編 > 1.1 NSString -文字列- > 1.1.1 NSStringと文字列定数



Objective-Cでは、文字列定数を

@"文字列定数"

と @"" で囲って記述するが、この文字列定数もNSStringの一種だ。そのため、文字列定数に対してもNSStringの各種インスタンスメソッドをコールできる。例えば、以下2つのコードは同じ結果となる。

NSString* string = [NSString stringWithString:@"TEST"];
NSLog( "%d", [string length] );     //< 4
NSLog( "%d", [@"TEST" length] );  //< 4

もっと言えば、@"TEST"で初期化したNSStringオブジェクトと、文字列定数の@"TEST"は同一のオブジェクトなのだ(アドレスも同じ)。

NSString* string = [NSString stringWithString:@"TEST"];
NSLog( "%p", string );     //< これが 0x12345678 だとすると・・・

NSLog( "%p", @"TEST" );  //< これも 0x12345678 になるのだ!

これにより、NSStringが自動でメモリ領域を共用し、使用するメモリ容量を節約してくれているのがわかる。

それでは、NSStringを文字列定数以外で初期化した場合もメモリは共用されるだろうか。以下のコードで実証してみよう。

NSLog( @"%p", @"TEST" ); //< 例: 0x3030
NSLog( @"%p", [NSString stringWithString:@"TEST"] ); //< 例: 0x3030
NSLog( @"%p", [[[NSString alloc] initWithString:@"TEST"] autorelease] ); //< 例: 0x3030
NSLog( @"%p", [NSString stringWithUTF8String:"TEST"] ); //< 例: 0x3d1ff10
NSLog( @"%p", [NSString stringWithUTF8String:"TEST"] ); //< 例: 0x3d21440

実行結果は以下のとおりだ。

0x3030

0x3030

0x3030

0x3d1ff10

0x3d21440

このように文字列定数以外で初期化した場合には、結果として保持する文字列が一緒であっても別のメモリ領域が使われてしまう。

また、文字列定数でなければ全く同じ初期化を繰り返しても新しいメモリ領域が使われてしまうこともわかった。

2009-12-31

UIKit本を執筆しました!

| 06:02 |  UIKit本を執筆しました! - iPhoneアプリ開発まっしぐら★ を含むブックマーク はてなブックマーク -  UIKit本を執筆しました! - iPhoneアプリ開発まっしぐら★  UIKit本を執筆しました! - iPhoneアプリ開発まっしぐら★ のブックマークコメント


【書籍名】


iPhoneプログラミングUIKit詳解リファレンス

f:id:tokorom:20091231055142j:image


Amazonでは2010年1月12日から販売予定です。全国の書店に並ぶのも同じくらいの時期と思われます。例外として、東京都内の一部の書店さん(ヨドバシアキバの有隣堂さん。同じく秋葉の書泉ブックタワーさん。ジュンク堂池袋さん。紀伊國屋新宿本店さんなど。)で12月25日から先行発売していただいております。



【コンセプト】


とにかくUIKitだけにこだわって480ページ書ききりました。

際限なくページが使えるわけでもないのでUIKit全メソッド!というわけにはいかなかったのですが、iPhone SDK 3.1.2 時点でAPIリファレンスについて公開されている全クラスについて言及しています(重要でない一部のクラスは本当に言及しているだけですが)。UIKitに関しては他のどの本よりも詳しく書いてあるはずです。UIKitについてだけ書いているので、それは当然ですね。

こういう本を書いたのは、こういう本を私自身が欲しいと思っていたからです。実際に私自身、自分で書いたこの本をいつも傍らに置いてiPhoneアプリの開発をしています(笑)。というのも、

  • あのクラスの初期化のしかたってどうだったっけ?
  • このメソッドひさびさに使うけど、前後を含めて動くコードを手っ取り早く見たい
  • このプロパティに設定できるパラメータって他にどんなのがあったっけ?

といった実際の開発のときによく遭遇する場面で意外と使えるんです。私はAppleのAPIリファレンスを愛用していますが、APIリファレンスだけだと実際に動くコードまでもっていくのが面倒な場合があるので、この本に載っている内容の場合には手っ取り早くこちらを参照しています。



【最近こう感じている人に読んで欲しい!】


  • Objective-Cは勉強した。次は順番からいってUIKitだろ!
  • 入門書は持っている。が、入門書に載っているよりも細かい情報が欲しい!
  • APIリファレンスを英語で読むのがちょっと面倒だ。
  • いくつかアプリを作ってきたけど、一度UIKit周りの知識を整理しておきたい。
  • UIKitの機能はだいたい知っている・・・と思うけど、なんか補完すべきことないかな。


【セールスポイント】


  • 他の本に載っていないところまでカバー

UIKitの各クラスについて使いはじめるところから書いているので、50%程度は他の本にも書かれているだろう内容です。

ただ逆に、残りの50%程度は他の本には載っていなかった細かいところまで書いたつもりです。

よっぽどの熟練者でない限り、必ず1つ以上「これ知らんかった」というのが見つかることを目標にしました。


  • OS3.0/OS3.1でのアップデートポイントを明確に

OS3.0/OS3.1に完全対応しています。

OS3.0以降で非推奨になったコードは一切使っていません。

また、アップデートされたポイントについては全てOS3.0/OS3.1というアイコンで明示しています。


  • カラーにすべきところはカラーで

UIColorのサンプルとか、UIImageのブレンドとか、カラーでないとわかりにくい部分はカラーページになっています。

これも他のiPhoneアプリ開発揚の本ではなかった部分と思います。

f:id:tokorom:20091231055311j:image


【自分で残念と思うところ】


メソッドの細かい書式が書いていない

紙という有限の媒体であるため、たくさんのメソッドを紹介するか/紹介するメソッドを減らして細かい書式まで書くかのトレードオフがあり、前者を選択しました。

申し訳ありませんが必要に応じてAPIリファレンスと一緒に参照していただき、この本にメモ書きをしていただいて完成度を高めてもらえると嬉しいです。

第2版のチャンスがあれば、もしかしたら少しページが増えても値段を上げなくてすむかもしれないので、そのときはみなさんからいただいたフィードバックと、このメソッドの書式関連を是非強化させてほしいです。



もし購読していただけるようでしたら

ココから是非!

そしてコメントやTwitterなどでフィードバックをいただけると嬉しいです。