2014年02月25日

[iOS]iPhoneのホーム画面みたないものを作りたい。

iPhoneのホーム画面のようにフルスクリーン画面を複数ページに分けて横スクロールさせる。さらにページ数をページコントロールでの表示も行って、切り替えも可能という画面の作り方。

UIScrollViewとUIPageControlを使う。都合によりiOS 6 SDK、Xcode 4.6.3を使っている。ARCは使う設定。

(0)準備

サンプルはSingle View Applicationのテンプレートで作成。プレフィックスはPGとした。
アプリケーションデリゲートクラス:PGAppDelegate
ベースとなるビューコントローラクラス:PGViewController
スクロール上に配置されるページ毎のクラス:PGPageViewController

paging_view.png

(1)UIScrollViewの配置。

Viewの上に配置すると自然と全画面サイズになってくれてビューサイズ変更に追随されるように設定されるのはInterface Builderならでは。

ポイントとしてはPaging Enabled をセットする。これでページ単位にスナップしてくれるようになる。または今回は横スクロールのみなのでShows Vertical ScrollersははずしてOK。bouncesはないほうがいいので外しているが好みなのでどちらでもいい。

page_preference.png

(2)UIPageControlの配置

UIScrollViewの上に載せるのだが、位置関係に注意しないとUIScrollViewの子になってしまう。Interface Builderでは左側の階層ビューで正しく配置する。親ビューとの関係では上方にあるビューが、実際には下になるので実行時に隠れてしまう。

ダメな例1:
page_control_x1.png

ダメな例2:
page_control_x2.png
(3)ページビューの生成

複数ページの生成をNib上で配置することができないので、viewDidLoad:の中でページ数分だけ生成してUIScrollViewのサブビューとして配置する。ViewControllerはiOS5からはchildViewControllersとして保持できるそこに追加すればいい。

実装の構造上このViewの生成時にはまだWindowには配置されていないのでサイズが確定していない。なのでここではページビューの生成だけにして位置の設定は後回しにする。

page_viewDidLoad.png
(4)ページビューの位置調整

AutoLayoutについて未だ勉強不足なので、もしかしたらもっと適切な設定方法があるのかもしれないが今回は位置調整が必要なタイミングで都度調整することに。

必要なタイミングは二カ所のはず。

初期化時:viewDidAppear:
縦横変更時:didRotateFromInterfaceOrientation:

page_adjustSubviews.png

UIScrollViewのサイズは実際にView上に表示されている範囲を示しているframeと、スクロールされる全体像の大きさを表すcontentSizeがある。

scrollview.png

page viewは0ページ目はUIScrollViewの(x,y)=(0,0)から配置するが、1ページはx座標がframeの幅1つ分ずらして配置、2ページ目はx座標がframeの幅2つ分ずらして配置する。

pageview.png

サンプルはgithubから。
posted by 永遠製作所 at 00:52| 東京 ☀| Comment(0) | TrackBack(0) | iPhone/iPod touch | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。