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より大きくないといけない
ということに注意して実装しましょう!