Sunflat のブログ

ソフトウェア開発についての話題が多いかも

InterfaceBuilderで作ったUIの色が変わる

追記1:どうも、常にこの問題が起こるわけではないみたい。新しいプロジェクトを作って試してみたら、この問題は発生しなかった。iPhoneSDK 2.0の時に作った古いプロジェクトを使いまわしているので、それが原因かもしれない。 →下の追記2も参照

iPhone SDKのInterfaceBuilderでゲームのタイトル画面を作ったのだが、同じソースファイルでビルドしたにもかかわらず、タイトル画面の背景色が微妙に変わってしまうことがあった(上図)。

詳しく調べてみると、どうもXCodeでビルドする時のディスプレイプロファイル(システム環境設定>ディスプレイ>カラー)によって、InterfaceBuilderで指定した色が変換されてしまうようだ。その結果、ビルド時に外付けディスプレイをつなぐかどうかで色が変わったりしてしまう。

実際に、実行時にbackGroundColorの値を表示してみると、以下のようにビルド時のディスプレイプロファイルによって若干変化している。

ビルド時のディスプレイプロファイル 実際に表示される色
カラーLCD kCGColorSpaceModelRGB 0.736403 0.2621 0.125456 1
カラーLCD (色温度をD50にカスタマイズ) kCGColorSpaceModelRGB 0.81819 0.337517 0.189591 1
DELL E207WFP kCGColorSpaceModelRGB 0.822632 0.210778 0.0575691 1
一般RGBプロファイル kCGColorSpaceModelRGB 0.839216 0.298039 0.0196078 1

実際に指定した色はRGB=(0xD6,0x4C,0x05)なので、上記の「一般RGBプロファイル」の場合が正しい値のはず。

というわけで、色の微妙な変化が気になる場合は、提出する実行ファイルをビルドする時に、ディスプレイプロファイルを「一般RGBプロファイル」に変更してからリビルド(クリーニングしてからビルド)したほうがよさそう。あるいは、下記のように色の値をハードコーディングしてしまうとか。

self.backgroundColor=[UIColor colorWithRed:(0xD6/255.f) green:(0x4C/255.f) blue:(0x05/255.f) alpha:1.f];

追記2:どうやら、xibファイルをテキストエディタで開いたときに「2」という項目があるとこの問題が発生するようだ。これを「1」にテキスト置換してやれば、問題は発生しなくなる。最新のInterfaceBuilderでUIを新規作成すると最初から後者になるが、前者の項目が残っているとそれが引き継がれるようだ。