Engineer Llfe Dogear

エンジニアリング活動におけるメモやTipsを書くブログ

UIScrollViewとAutolayout

画面の回転を考慮した, Autolayoutを利用したUIScrollViewの使い方

Autolayoutと, UIScrollviewを利用して, UITableViewと同じような画面を作成したかったときに, 画像の回転やConstraintの警告をなくすのにハマったので, その対応方法をまとめてみました. 実現したいことはUITableViewを使えばできることだとは思うのですが, 今回はUIScrollViewでの実現を目的としています.

サンプルアプリをもとに, 作成手順について以下に説明します.

サンプルアプリの画面構成
  • UIViewの上に, UIScrollViewを配置
  • UIScrollViewの中に, Frameとなる2つのUIView(以下, RedFrameView, BlueFrameViewとする)を設置
  • RedFrameViewとBlueFrameViewにそれぞれにUILabelを配置
    • RedFrameViewとBlueFrameViewはUILabelの長さに応じて, 高さ方向が可変

f:id:dogear11:20140420155039p:plain

それぞれのViewのConstraintの設定

まず, UIScrollViewについては, 親のUIViewから上下左右に20のマージンを持つようConstraintを設定します. 次に, RedFrameViewの中のUILableについて以下の図のように, RedFrameViewから上下左右20のマージンを持つようConstraintを設定します.

f:id:dogear11:20140420161250p:plain

BlueFrameView内の, UILabelについても同様に設定します.

次に, RedFrameViewのConstraintを設定します. まず, 以下の図のように, 親のUIScrollViewに対して, 左右と上方向のマージンが0となるよう設定します.

f:id:dogear11:20140420162030p:plain

そして, UIScrollViewとRedFrameViewの両方を選択した状態で, それぞれの幅(width)が同様になるようConstraintを設定します. この設定を行うことで, 回転などによりUIScrollViewのwidthが変わった場合でも, UIRedViewのwidthが追従して変更されます.

f:id:dogear11:20140420162201p:plain

最後に, BlueFrameViewのConstraintを設定します. まず, 親のUIScrollViewに対して, 左右, 下方向のマージンが0, RedFrameViewに対して, 上方向のマージンがある一定の感覚(今回は8)となるように設定します. このとき, 下方向のマージンは通常BlueFrameからUIScrollViewのBottomまでの長さが設定されていますが, 0と設定することで, Scrollが有効になります.

f:id:dogear11:20140420163311p:plain

最後に, RedFrameViewの場合と同様に, BlueFrameViewについてもUIScrollViewとのwidthが同じになるようConstraintを設定します.

f:id:dogear11:20140420163548p:plain

サンプルアプリの結果

以下の図のように, RedFrameView, BlueFrameViewがそれぞれUILabelの長さに応じて可変になっている様子がわかります.

(プログラムでUILabelに文字列を指定し, numberOfRowsを0と指定 )
また, 画面の回転によって, UIScrollViewの大きさが変更し, それに伴い, RedFrameView, BlueFrameViewのUIScrollViewのwidthの大きさに沿うように変更されます.

f:id:dogear11:20140420164115p:plain

f:id:dogear11:20140420164123p:plain

サンプルソース

今回作成したサンプルアプリのソースです.

サンプルソース