LoginSignup
1
2

More than 5 years have passed since last update.

【Swift】UIScrollViewとLoadView()と非同期処理

Posted at

忘備録です。
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)
        }
    }


これでなんとか動いてくれました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2