前回のつづき

サンプル: https://github.com/stack3/STUniversalSample

前回、できるだけiPhone/iPadでViewController、xibを共通にしたほうがよいと言いました。今回は本サンプルでどのように共通化されているかを見ていきたいと思います。

タイムライン画面(STTimelineViewController)のxibファイルです。

STTimelineViewController.xib

f:id:eimei23:20130413192519p:plain

View全体にUITableViewが貼り付けられています。Size InspectorからAuto LayoutのConstraintsを見てみましょう。

f:id:eimei23:20130413192706p:plain

このようにUITableViewの上下左右はSuperview(View)の端とくっつくようになっています。つまり、端末のサイズが変わってViewのサイズが変われば、それに応じてUITableViewも伸縮することになります。

次にタイムライン画面の各行(セル)のxibを見てみましょう。

STPostViewCell.xib

f:id:eimei23:20130413193648p:plain

※ 各Subviewを選択してConstraintsを表示した状態にしています

左上の画像表示用のUIImageViewのConstraints

f:id:eimei23:20130413195715p:plain

  • 幅と高さを64pxで固定
  • STPostViewCellの上端と左端のサイズを20pxで固定
  • 右のUsername(UILabel)との間隔を16pxで固定 

Username表示用のUILabelのConstraints

f:id:eimei23:20130413195726p:plain

  • UIImageViewとの間隔を16pxで固定
  • STPostViewCell上端、右端との間隔を20pxで固定

Message表示用のUILabelのConstraints

f:id:eimei23:20130413195740p:plain

  • STPostViewCell右端、下端との間隔を20pxで固定
  • STPostViewCell上端との間隔を50pxで固定

これらのConstraintsによりST`PostViewCellのサイズにあわせて伸縮すべきものは伸縮し、固定されるべき間隔は固定され、レイアウトが保たれるようになっています。

STUserViewController.xib、STSettingsViewController.xibも同じように端末のサイズによってレイアウトが保たれるようにAuto LayoutのConstraintsを設定しています。

片方はTab、片方はPopoverで表示する場合

STSettingsViewControllerは、iPhoneではタブの中身として表示、iPadではPopoverの中身として表示されるようになっています。それを考慮してSTSettingsViewControllerの各プロパティを設定しています。

initメソッドの以下のコードを見てみましょう。

        //
        // For iPhone.
        //
        self.tabBarItem.title = @"Settings";
        self.tabBarItem.image = [UIImage imageNamed:@"GlyphishIcons/19-gear"];
        //
        // For iPad.
        //
        self.contentSizeForViewInPopover = CGSizeMake(320, 320);

iPhoneでタブの中身として表示された時のために、tabBarItemプロパティを設定しています。

  • title – タブのタイトル
  • image – タブのアイコン

iPadでPopoverの中身として表示された時のために、contentSizeForViewInPopoverプロパティを設定しています。これは、Popoverで表示された時のサイズを決定します。

タブの中身として表示された時は、contentSizeForViewInPopoverは参照されず、Popoverの中身として表示された時は、tabBarItemは参照されません。UI_USER_INTERFACE_IDIOM()を使ってiPhone/iPadの判断をして、必要なプロパティだけ設定するような事はしなくても良いでしょう。

 

以上、iPhone、iPad両方対応のUniversalプロジェクトについての説明でした。