UIScrollView
をコードで実装
独学でアプリ制作しているんですけど、そういえばscrollView
使ったことないなと思ったので勉強しました!
まず、全く調べずにscrollView
を使ってみようとしました。
そのコードがこちら
class ViewController: UIViewController {
private let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
let scrollView = UIScrollView()
scrollView.frame = .init(x: 0, y: 0,
width: view.frame.size.width, height: view.frame.size.height)
view.addSubview(scrollView)
scrollView.addSubview(label)
label.text = "hello world"
label.frame = .init(x: 0, y: 0, width: 100, height: 50)
label.center = scrollView.center
}
}
結果はスクロールできませんでした。
label
はscrollView
がちゃんと表示されているか確認するために追加しています。
なんで!?と思い調べてみるとcontentSize
というものを指定しないといけないらしい。
contentSize
はスクロール領域を決めるらしい。
ということで修正したものがこちら
class ViewController: UIViewController {
private let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
let scrollView = UIScrollView()
//scrollViewの大きさを設定。
scrollView.frame = .init(x: 0, y: 0,
width: view.frame.size.width * 2, height: view.frame.size.height * 2)
//スクロール領域の設定
scrollView.contentSize = CGSize(width:view.frame.size.width * 2, height:view.frame.size.height * 2)
//scrollViewをviewのSubViewとして追加
view.addSubview(scrollView)
scrollView.addSubview(label)
label.text = "hello world"
label.frame = .init(x: 0, y: 0, width: 100, height: 50)
label.center = scrollView.center
}
}
これでどうだ!と思いビルドしましたがスクロールできませんでした。
さらに調べると、frame
がcontentSize
より小さくないといけないみたい。
class ViewController: UIViewController {
private let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
let scrollView = UIScrollView()
//scrollViewの大きさを設定。
scrollView.frame = .init(x: 0, y: 0,
width: view.frame.size.width, height: view.frame.size.height)
//スクロール領域の設定
scrollView.contentSize = CGSize(width:view.frame.size.width * 2, height:view.frame.size.height * 2)
//scrollViewをviewのSubViewとして追加
view.addSubview(scrollView)
scrollView.addSubview(label)
label.text = "hello world"
label.frame = .init(x: 0, y: 0, width: 100, height: 50)
label.center = scrollView.center
}
}
結果は...いけたーーーー!!!
まとめ
UIScrollView
を使うときは
contentSize
を指定しないといけない
contentSize
はframe
より大きくないといけない
ということに注意して実装しましょう!