HOME > 問題解決一覧 > awakeFromNibでView要素のframeサイズがおかしい

事象

iOS10(Xcode10)になってからカスタムUIViewクラスでawakeFromNibを実行するタイミングで、今までは想定通り、Auto Layoutで端末に合わせてUIView要素のサイズが決まった状態の値が取得できていたのが、出来なくなりました。 デバッグしてみるとframeの値がx:0,y:0,width:1000,height:1000というような値が返って来ます。

例)例えば下記のようなカスタムViewを作ったとします。

CustomView.swift

class CustomView: UIView {
    @IBOutlet weak var aView: UIView!
    :
    :
    override func awakeFromNib() {
        print("[awakeFromNib] aView.frame:(aView.frame)")
    }
}

CustomView.xib

1

このようにframeの値が(50,50,100,100)と期待していたのに(0,0,1000,1000)になってしまいました。

2

これはどのようにしたら今までどおりAutoLayout適用後のframeの値が取得できるようになりますでしょうか。

回答

自己解決しました。

通常はawakeFromNibでは配置したView要素のframeは上記のとおりAutoLayautoを適用する前の値が返ってくるようになったようです。awakeFromNibでAutoLayoutを適用したframeの値を取得したい場合には、awakeFromNibの箇所ではなく、layoutSubviewsのメソッドをオーバーライドしてその箇所で取得できます。

override func awakeFromNib() {
    super.awakeFromNib()
    // ここでは各View要素のframeはAutoLayout適用前の値
}

override func layoutSubviews() {
    super.layoutSubviews()
    // ここでは各View要素のframeはAutoLayout適用後の値
}

そもそもawakeFromNibはiOS9以前からもAutoLayout適用のframeの値は入ってこないようです。(なぜいままで入っていたのだろう。。)なのでAutolayout適用のframeの値を取得したい場合にはlayoutSubviewsで取得してください。

参考記事

http://blog.asobicocoro.com/entry/2016/04/11/225652

http://stackoverflow.com/questions/39503661/cornerradius-stopped-working-in-swift-2-3-ios-10-xcode-8

コメント

この記事に関する質問やご意見・ご感想がありましたら、下記よりコメントください。
Githubアカウントでログインしていれば誰でも投稿できます。