Hatena::ブログ(Diary)

Kazzzの日記 このページをアンテナに追加 RSSフィード

2013-09-27

[][]iOS6iOS7で違うTintColorプロパティ意味

iOS6からiOS7への移行で困った点の第二弾。

バー系ビューの透過設定のデフォルトとTint(色合い)の違い

iOSアプリケーション重要役割を占めるバー系のビュー(ナビゲーションバー、ステータスバー、ツールバー等)の背景は透過するのがデフォルトとなった。これはiOS7の基本的なデザインの考え方が透過、又は半透過のレイヤを重ね合わせることを前提にしているからだと思われる。

これも例を見てもらうと分かりやすい。

Xcode5でデフォルトで生成されたナビゲーションコントローラにおける、ナビゲーションバーのプロパティは以下のようになっている。
f:id:Kazzz:20130928001407p:image:w300
Navigation Bar/Bar TintとView/Tintに着目して欲しい。
この状態で実行するとiOS6、iOS7ではそれぞれ以下のようになる。

実行結果 (Translucent=YES, Bar Tint=Default, Tint=Default)
iOS6iOS7
f:id:Kazzz:20130928001408p:image:w300f:id:Kazzz:20130928001409p:image:w300

これは双方のデフォルトであり、特に問題は無いだろう。

ここでiOS6の標準のバーの色が地味でつまらない(よくあることだ)ので、青に変更したいとしよう。
Interface-Builderで新設されたBar Tintを青色に変える。
f:id:Kazzz:20130928002004p:image:w300

実行結果 (Translucent=YES, Bar Tint=Blue, Tint=Default)
iOS6iOS7
f:id:Kazzz:20130928002003p:image:w300f:id:Kazzz:20130928002002p:image:w300

iOS6は全く変わらない。Bar Tintは新設だけにiOS6では無視されるようだ。iOS7では色が着いたが透過なので微妙な感じになっている。※

なので今度は透過を外してみよう。
f:id:Kazzz:20130928002337p:image:w300

実行結果 (Translucent=NO, Bar Tint=Blue, Tint=Default)
iOS6iOS7
f:id:Kazzz:20130928002336p:image:w300f:id:Kazzz:20130928002335p:image:w300

iOS7は真っ当な色目になったが、iOS6はやはり全く変わらない。(iOS7ではタイトルバー上の文字の色が黒いため見づらくなっているが、これは別途修正できる)

今度はViewカテゴリのTint色を変えてみよう。これはiOS6まではナビゲーションバーの色を変えていたプロパティだ。
f:id:Kazzz:20130928002550p:image:w300

実行結果 (Translucent=NO, Bar Tint=Blue, Tint=Blue)
iOS6iOS7
f:id:Kazzz:20130928002549p:image:w300f:id:Kazzz:20130928002548p:image:w300

iOS6では漸く期待通りのTint(色合い)になった。ツールバーも同様に変更すれば良いだろう。(本来このように基本GUIのTintを変えるには、Appearance Proxyを使って一括で変更するものだろう)
iOS7も一見良さそうだがよく見てみるとナビゲーションバーの右端に配置したボタン(UIBarButtonItem)の色がナビゲーションバーと同じになったせいで、全く判別できなくなっている。

ここまでで分かったことだが、Bar TintとTintプロパティの意味がiOS6とiOS7で違う。

  • Bar Tint
    • iOS6 : 無視される
    • iOS7 : ナビゲーションバーのTint色を設定する

  • Tint
    • iOS6 : ナビゲーションバーのTint色を設定する
    • iOS7 : ナビゲーションバー上に配置されたコントロールのTint色を設定する

ここで問題なのは、iOS6にとってナビゲーションバーやツールバーのTintを決定しているプロパティがiOS7ではそれ自身ではなく上に配置された他のコントロールの背景や文字のTintを決定していること。
従って前回同様、iOS6のデザインに合わせるとiOS7では期待通りの見栄えにならないのだ。

今回の問題に対応するコード書くならばさしずめ以下のようになるだろうか。

- (int)osMajorVersion
{
    return [[[[UIDevice currentDevice] systemVersion]
             componentsSeparatedByString:@"."][0] intValue];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIColor* barTintColor = [UIColor blueColor];
    UIColor* barButtonTintColor = [UIColor whiteColor];

    if ( [self osMajorVersion] >= 7 )
    {
        self.navigationController.navigationBar.barTintColor = barTintColor;
        self.navigationController.navigationBar.tintColor = barButtonTintColor;
    }
    else
    {
        self.navigationController.navigationBar.tintColor = barTintColor;
    }
}

このように直していくのは簡単なのだが、怖いのはApple側の気まぐれで急に元の振る舞いに戻ることである。それをされるとこのようなアドホックなコードは破綻する。
にしても、どうして同名のプロパティで意味を変えてしまうのか理解に苦しむ。

※前回のエントリで対策されたViewControllerを使用しているため、iOS6とiOS7でコンテンツのY軸はずれない。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Kazzz/20130927/p1
リンク元