addSubView で追加したビューの表示位置がズレる : iPhone プログラミング

PROGRAM


addSubView で追加したビューの表示位置がズレる

iOS アプリの作成中、Storyboard で作成した UIViewController が持つ UIView を addSubview してみたところ、ちょうどステータスバーくらい下にズレてしまうことがありました。

緑色の UIView にぴったり、茶色の UIView を乗せているはずなのですけど、僅かにずれてしまっています。

Storyboard 上ではちゃんと、茶色の UIView の X と Y は 0 になっているのですけど、どうやら UIStoryboard の instantiateViewControllerWithIdentifier: メソッドを使ってインスタンス化した時点で、既に UIView の frame.origin が少し動かされてしまっているようです。

そんな時は、 frame.origin を CGPointZero にすることでも対応できるのですけど、Storyboard 上の設定で簡単に対応できるようでした。

 

NIB 復帰時のサイズ調整を無効化する

まずは Storyboard から、addSubview したときにずれてしまうビューを持つ UIViewController を選択します。

その UIViewController の "Attributes Inspector" を開いて、その中の "Resize View From NIB" のチェックを外します。

 

こうすることで、インスタンス化した時点で frame.origin が (0, 0) になって、addSubview をしたときにちゃんと左上を起点にして表示されるようになりました。

この "Resize View From NIB" という設定は、どうやら NIB 内でインスタンスが作られたときに、適切な位置調整を行ってくれるもののようでした。

ただし initWithNibName:bundle: で初期化する場合は影響しないらしいので、つまり NIB 内に UIViewController を配置した時(この時は initWithCoder: で初期化される様子)のどこかで自動調整してくれることになるのでしょうか。

ともあれこの機能が影響して、UIView をステータスバーの分だけ引き下げて配置してくれた様子です。

 

initWithNibName:bundle: を使用した時に表示位置がズレる場合

今回の主題とはずれたお話になりますけど、例えば initWithNibName:bundle: で生成した UIViewController の UIView をメインの UIWindow に addSubview したら UIView の上側が隠れてしまうような場合。

そんなときには、次のようにして、その UIView の frame を調整するようにすると良いかもしれません。

viewController.view.frame = [UIScreen mainScreen].applicationFrame;

このようにすることで、UIView の frame を、アプリケーションの表示領域に合わせることができるようです。

もちろん、NIB 内で設計したのとサイズが変わった場合には Auto Layout などの機能でレイアウトが自動調整されることになるので、そういったところにも配慮して NIB を設計する必要があります。

[ もどる ]