頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


ステータスバーの見た目を変えてみる

ところで、ナビゲーションバーの色を黒とか他の色に設定すると気になるのが、ステータスバーの色。

ステータスバーというのはiPhoneの画面上部にあるバッテリーや電波の状況、時間なんかが書いてるあの部分のことですね。

このステータスバーの色を変えるのはどうするのかなと思って調べたら、ちゃんとあるじゃないか。

[application setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
ってのを記述すれば、確かに黒くなるんだけど、、、

アプリ起動時に一瞬だけデフォルト(というか白っぽい)ステータスバーが表示されるのです。
その後にパッと黒く変わるもんだからなんだか、、、うざい!

クックパッドなどステータスバーが黒いアプリを見てもそんな症状出てないし、何かあるのかと思って調べるとこんな記事が。

あらびき林檎。 - iPhoneアプリ ステータスバーを消す

なるほど、info.plistで設定するのか、、、

ステータスバーの見た目を変える

↑ということでやってみると、見事、起動時から黒くなってくれましたぞ!


ナビゲーションバー用のボタンをいじってみた

前記事「ナビゲーションバーをいじってみた」に続いて、ボタンをいじってみました。
以下の内容はナビゲーションバーに置くボタンについてです。
つまり、viewController内で
self.navigationItem.rightBarButtonItem = barButtonItem;
などとする場合を想定しています。

(1)ボタンの表示方法
上記コードの右辺はUIButtonではなく、UIBarButtonItemクラスのオブジェクトだよね!(とわざわざ書くのは私がよく間違えるから)
、、、ともかく、コードの流れはこんな感じになるはず。
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(0.f, 0.f, 100.0f, 40.0f);
[button setTitle:@"ボタン" forState:UIControlStateNormal];
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationItem.rightBarButtonItem = barButtonItem;
[barButtonItem release];
↓UIButtonTypeRoundedRectの場合の結果がこれ。

ナビゲーションバーのボタン1

↑まあサイズとかはおいといて、とりあえず表示はできた、ということで。

(2)100~102番のボタン
上のボタンなんかよりは100~102あたりのボタンが美しいかな、と思ったりしてまして。
最初のコードの1行目を変えて、frameの設定は不要。
UIButton *button = [UIButton buttonWithType:100];

ナビゲーションバーのボタン2

↑すると、結果がこんな感じ。
文字の量で勝手にボタンのサイズを変えてくれるのでframeを設定する必要がないみたい。

ナビゲーションバーのボタン3

↑101番だとこんな風になる。
ナビゲーションでpushして画面遷移したら左上に出る"戻るボタン"と同じ形だな。

ナビゲーションバーのボタン4

↑102番はこんなの。100番と少し色が違うな。

(3)ナビゲーションバーの色を設定してみると
ナビゲーションバーの色を
self.navigationController.navigationBar.tintColor = [UIColor 略
って感じで設定すると、この時の100~102番のボタンは以下のようになりました。

ナビゲーションバーのボタン5

↑100番の場合。
ほー、ボタンの色がそれらしく変わってくれたじゃあーりませんか!
自分で設定しなくても、ナビゲーションバーの色にあわせてテキトウに変えてくれるんですな。

ナビゲーションバーのボタン6

↑101番の場合、、、あれ?
左が尖ってないよ?
尖ろうとしているのか文字は右に寄ってるんですがね、、、
ちなみにleftBarButtonItemに設定しても尖ってくれませんでした。

ナビゲーションバーのボタン7

↑102番だと、、、なるほど、これもナビゲーションバーの色に合わせてボタンの色を変えてくれるのですが、100番より少し濃く表示されるんですね。

なお、前記事にあったようにカテゴリーを使って、ナビゲーションバーの背景に画像を設定してみたところ、100番のボタンは下のようになりました↓

ナビゲーションバーのボタン8

↑ああ、そうなの、この色になるのか。
ということは、ナビゲーションバーに画像を使うと、ボタンのデザインも必要になるんだな、、、


ナビゲーションバーをいじってみた

ナビゲーションバーってどのようにいじれるのかテストしてみたのでメモ。

↓デフォルトはこんな感じですよね。
ナビゲーションバー1


(1)ナビゲーションバーの色を変えてみる
viewController内で、
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
としてやると、、、ありゃ?変わらない???
なんで?と思っていろいろやってると、どうもイニシャライザ部分に記述すると無視されてしまう。
loadViewに記述するとこの通り↓

ナビゲーションバー黒

おー、なんだか渋くなったな。
たまにこういうアプリを見たことがあったけど、こうやってたんだな。

ここで設定できる値はリファレンスによると、UIBarStyleBlackOpaque、UIBarStyleBlackTranslucentなんてのもあるけど、Deprecated.ってあるから使わないでおこうっと。


(2)tintColorで色を設定してみる
self.navigationController.navigationBar.tintColor = [UIColor greenColor];
みたいにすれば、ナビゲーションバーの色を変えることができる。

ナビゲーションバー2

↑ちなみにこれは[UIColor greenColor]ではなく、
[UIColor colorWithRed:0.601 green:0.837 blue:0.408 alpha:1.0f]
としてます(greenColorだと目にやさしくないので、、、)。


(3)透過にしてみる
self.navigationController.navigationBar.translucent = YES;
とすれば、背景がやや透けてくれますが、UIColorでのalphaの設定値は無関係みたい。
↓うっすら透けて文字が見えますな。

ナビゲーションバー3


(4)背景画像を設定してみる
リファレンスみてもそれらしいのがなかったので、ネットで調べるとこんなページが。
UINavigationBarの背景を画像に ― ssonLogger
カテゴリーってやつですね。

ナビゲーションバー素材

↑こんな32×44pxの画像を使ってみました。
その結果がこちら↓

ナビゲーションバー4

あー、なるほど、画像が小さいと敷き詰める、とかではなくナビゲーションバーのサイズに拡大して表示するんですね。


不明なのが、タイトルの文字の色を変える方法。
まあ使わないだろうからいいか(おいおい、ずいぶん手抜きだねえ)。






NSMutableDictionaryのinitWithCapacity:はいくらにするの?

NSMutableDictionaryを使おうとしたのですが、よくわからなかったので基本的な動作確認をしてみました。

なるべくautoreleaseしたくないってことで、初期化するメソッドを見ると、、、
initWithCapacity:
なんてのがありますね。

ん?なんだ、このキャパシティってのは?
リファレンスにこの値はあくまで初期化時のキャパで必要に応じてメモリは割り当てますよ、と書いてます。

それじゃこの数字はテキトウでいいのかな?
ってことで値をゼロで初期化しても大丈夫か確認してみました。

NSMutableDictionary *md = [[NSMutableDictionary alloc] initWithCapacity:0];

[md setObject:@"apple" forKey:@"0"];
[md setObject:@"banana" forKey:@"1"];

NSLog(@"%[0] = %@",[md valueForKey:@"0"]);//[0] = apple
NSLog(@"%[1] = %@",[md valueForKey:@"1"]);//[1] = banana
NSLog(@"[md count] = %d",[md count]);//[md count] = 2

[md release];

どうも問題ないようで、、、よかった。

あと確認したのが、キャパの数値を10とかにしても、オブジェクトを入れなければ[md count]はゼロでした。
ふーん、そういうものですかい。


NSMutableStringでタブ間データのやりとり

とぼけたことをしていたのでネタってことでエントリー。

例えばtabBarアプリでのお話とします。

HogeAppDelegate.mでUITabBarControllerのオブジェクトを作って各タブの中身となるviewControllerを突っ込んでいく、という形。

突っ込むviewControllerのオブジェクトをここでは
tab1ViewController
tab2ViewController
とでもしましょう。

やりたかったのが、各タブ間(tab1とtab2)でのデータの受け渡し。
そんなに大量のデータのやりとりではなく、単にBOOL値1つ程度。

Core Dataの"一時"ってのにチェックして使ってもできたけど、もう一つなんと言うか面倒。

ややダサイけど共通の文字列型のデータを持たせて済ませてしまおうと思いましたが、、、

まず、おおもとであるHogeAppDelegate.hで
NSString *isFinish;
と宣言しておく。

HogeAppDelegate.mでは
isFinish = @"NO";
ってな具合に初期値設定(他にも方法あるけど、どれも以下の結果は変わらず)。
あとタブの中身となるviewControllerにこの参照を教えてあげる。
tab1ViewController.isFinish = isFinish;
tab2ViewController.isFinish = isFinish;
こんな感じね。

もちろん、tab1ViewControllerもtab2ViewControllerもisFinishってプロパティを設定しておく。

で、(仮に)tab1内でこのself.isFinishを書き換えることにします。
理想的には、tab2のviewWillAppear:なんかでself.isFinishがYESなら必要な処理をする、とかそういうことをしたいわけです。

ところが、tab1内でself.isFinishを"YES"と書き換える方法であれ?となりまして、、、
self.isFinish = @"YES";
self.isFinish = [[NSString alloc] initWithString:@"YES"];
self.isFinish = [NSString stringWithString:@"YES"];

↑どうやっても、うまくいかない。
つまり、self.isFinishは書き換えられても、HogeAppDelegate.m内のisFinishも、tab2内のself.isFinishも変わっていないのです。
tab1内でポインタを確認すると、新しくなっており、別の変数になっちゃっている感じ。

んー、どうしたものかと調べてて気が付いたのが、NSMutableStringクラスなんてのがあったじゃないかっ!
うっかりしてたよ~!

ええ、NSStringをNSMutableStringに変えて、書き換えを
[self.isFinish setString:@"YES"];
とすれば、意図通り動いてくれました。
もちろん、ポインタも変わらず。

ふー、この調子じゃアプリの完成はいつになるやら、、、?




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad