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
このようにframeの値が(50,50,100,100)
と期待していたのに(0,0,1000,1000)
になってしまいました。
これはどのようにしたら今までどおり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アカウントでログインしていれば誰でも投稿できます。