サブビューのレイアウトを親ビューのサイズを使って相対的に定義することで、
画面回転による縦横にもスムーズに対応することができます。

レイアウト調整の例

-(void) layoutSubviews {
  [super layoutSubviews];

  float width = self.bounds.size.width;
  float height = self.bounds.size.height;

  // 間隔(padding)を空ける
  float pad = 10;

  // 左上
  _leftTopView.frame = CGRectMake(pad, pad, 100, 100);
  // 中上
  _centerTopView.frame = CGRectMake((width - 100) / 2, pad, 100, 100);
  // 右上
  _rightTopView.frame = CGRectMake(width - 100 - pad, pad, 100, 100);
  // 左中
  _leftMiddleView.frame = CGRectMake(pad, (height - 100) / 2, 100, 100);
  // 中中
  _centerMiddleView.frame = CGRectMake((width - 100) / 2, (height - 100) / 2, 100, 100);
  // 右中
  _rightMiddleView.frame = CGRectMake(width - 100 - pad, (height - 100) / 2, 100, 100);
  // 左下
  _leftBottomView.frame = CGRectMake(pad, height - 100 - pad, 100, 100);
  // 中下
  _centerBottomView.frame = CGRectMake((width - 100) / 2, height - 100 - pad, 100, 100);
  // 右下
  _rightBottomView.frame = CGRectMake(width - 100 - pad, height - 100 - pad, 100, 100);
}

ユニバーサル対応

iPhoneサイズに適したレイアウトとiPadサイズに適したレイアウトは異なるので、分岐が必要になっていきます。IBを使う場合はiPhone用とiPad用のxibファイルを用意したりメンテナンス性に問題がありましたが、layoutSubviewsはシンプルに対応できます。
HogeView.m
-(void) layoutSubviews {
  [super layoutSubviews];

  float width = self.bounds.size.width;
  float height = self.bounds.size.height;

  BOOL isPad = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);

  // iPadの場合は高さ300、iPhoneの場合は高さ100
  float hogeH = (isPad) ? 300 : 100;
  _hogeView.frame = CGRectMake(x, y, hogeH, width);
}
最終更新:2014年07月15日 00:24