AnbLnの日記

AnbLn@ぽりえすてるのブログ

日記0002とUIScrollViewのスニペット

5月8日(火)

朝、9時に起床。2限代数学特論出席。4限代数幾何出席。夜アプリ開発

この日のアプリ開発自体は順調だが、明らかに13日までにリリースできるとは思えない。スケジュールを明日しっかり立ててみる。

スケジュール管理のために、コーディングにどれくらい時間を要するかわかるようになるといいと思った。今日の感じだとViewController一枚のコード30分〜、といった感じか。今後の課題である。



UIScrollView with AutoLayout

iOSアプリのUIをつくるとき、storyboardを使うかコードで記述するかの二択を選ぶことになります。AutoLayoutは後者においても非常に扱いやすく便利です。

さて、UIScrollViewのAutoLayoutは普通のviewとは若干扱いが異なるようです。


UIScrollView Aと、Aに追加されたサブビューの制約」は、「AのcontentViewと、Aに追加されたサブビューの制約」と解釈されるようです。

これはUIScrollViewの機能を考えれば自然です。

考え方としては、contentViewは無限に広がる平面なんだけど、制約をつけた瞬間にそこがその平面の端に決まるということです。

大抵の場合は以下のコードのように大きなUIViewを置くのが簡明です。
この例では横に二ページ分の広さを持つcontentViewを作っています。
それには、UIView matをscrollViewに追加して、四方に制約をつけて、matのwidth, heightの制約をつけています。
普通のviewでは制約が多すぎるって怒られるところですが、このコードは怒られません。

let mat = UIView()
scrollView.addSubview(mat)
mat.translatesAutoresizingMaskIntoConstraints = false
mat.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
mat.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
mat.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true
mat.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
mat.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 2.0).isActive = true
mat.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true