Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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


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

Gokna
新卒で10年PG,SEとか技術営業とか運用とかをした後他業種で遊んでいたけれど、もう一度プログラマに戻るべくSwiftとか勉強中。 昔は業務アプリ屋(メイン言語はC,C++)だったので、今現在人員不足であろうWeb系は遠い世界…。 10年PCではゲームしかしてなかったから、初心者と何も変わらないよ!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした