忘備録です。
UIScrollViewがLoadView()とviewDidLoad()でViewControllerを再読込した時にスクロールしてくれなくなったので、動くようにするにはどうしたらいいのか躓いたので解決方法をメモしておきます。
前提
- swift4.2,xcode10
- UIScrollViewを画面に配置、その中にUIViewを置く
- そのUIViewの中に部品をコードで生成して入れる
- TableViewで選択された内容でScrollViewやボタンの内容が変更
- 内容が変わるのでUIViewControllerを読み込み直す(本の内容を同じViewController内でページを変えていくイメージ)
- UIViewControllerを読み込み直すやり方はLoadView()とviewDidLoad()のコールで行う
やったこと
- viewDidLoad()でデータを読み込む
- その内容に従ってUIScrollView内のViewにLabelや画像を貼り付けていく
- その内容によって変わる高さを計算してviewDidLayoutSubviews()で中のViewのheightとUIScrollViewのContentSizeを設定する
結果
- 初回の内容は問題なく表示され、スクロールが出来る。
- が、UITableViewでリストを選んでLoadView()とviewDidLoad()をコールしたところ、ScrollViewの外に設置してあったUITableViewは問題ないがUIScrollViewがスクロールしなくなった
対策
- viewDidLayoutSubviews()で非同期処理としてContentSizeの更新を走らせる
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let contentWidth = ScrollView.bounds.width
// 非同期処理にてUIの更新
DispatchQueue.main.async {
// offset - 内部のコンテンツのトータルのHeightをインスタンス変数にしてあります
// Viewの高さ
self.View.frame.size.height = self.offset
self.ScrollView.contentSize = CGSize(width: contentWidth, height: self.offset)
}
}
これでなんとか動いてくれました。