読者です 読者をやめる 読者になる 読者になる

【swift】addSubviewしたviewがずれたときの対処メモ

はじめに

結論からいうと回避策はわかったので対処はしたのですが、原因がわかっていません、、、

現象としては、viewDidLoadでaddSubviewしたviewが縦にずれる(画面からはみでる)
しかし、pushViewControllerで別ページへ遷移後に戻ってくるとずれることなく表示される
というものでした

対処方法

で、具体的には以下のような形で実装していたのですがAPI取得処理完了後にaddSubviewを行ったのが原因(?)かどうかはわからないのですが。
どうもAPI取得処理完了後にaddSubviewを行ったのが原因ぽいのです、、、

ViewController.swift(不具合ありバージョン)

class ViewController: UIViewController {

    var data: [AnyObject]!

    override func viewDidLoad() {

        // データ初期化
        data = [AnyObject]()

        // API処理終了後にsetViewメソッドを呼んで画面描画
        getByApi(setView)
    }

    // 画面描画
    func setView() {
        self.view.addSubviewメソッドを順番によんでいく
        ・・・
    }

    // 1. APIからデータを取得して変数に保持
    // 2. .取得後のコールバックを実行
    func getByApi(callBackClosure:() -> Void) -> Void {
        Alamofire.manager
            .request(.GET, "http://example.com/get")
            .responseJSON { request, response, JSON, error in
                var res: Dictionary<String,AnyObject>?
                if let r = JSON as? Dictionary<String,AnyObject> { res = r }
                self.data = res
                callBackClosure()
        }
    }
}

ViewController.swift(修正バージョン)

class ViewController: UIViewController {

    var data: [AnyObject]!

    override func viewDidLoad() {

        // データ初期化
        data = [AnyObject]()

        // 画面にviewを追加
        setView()

        // API処理終了後にビューの更新など
       getByApi { () -> Void in
           // tableView.reloadData()などで画面の再描画を行う
       }
    }

まぁ、もともとの処理はきっと悪いのだとはおもいますが、、、なぜずれるのかは未だに原因はわかっていません
以上です