[Xcode 8] layoutSubviewsのタイミングでビューのサイズが1000×1000になってしまう問題
開発環境
- Xcode Version 8.0 (8A218a)
- Swift 3.0
何が起こったか
いつものようにstoryboardでUITableViewCell
のレイアウトを組み、(もちろんAutoLayoutで)UIImageView
を円形にしたかったので以下のように実装したところUIImageView
が表示されなくて?となってしまいました。
レイアウトはこんな感じ
コードはこんな感じ
override func layoutSubviews() { super.layoutSubviews() imageView.layer.cornerRadius = imageView.frame.width / 2 imageView.layer.masksToBounds = true }
これは何かおかしい...と思い、UIImageView
のframeを出力してみたところ、サイズが1000 x 1000になってる...
layoutSubviews imageView.frame = (0.0, 0.0, 1000.0, 1000.0)
対応方法
(当たり前ですが)drawrectの中ではframeがちゃんと意図した大きさになっていたので
以下のようにfunc draw(_ rect: CGRect)
の中でframeを操作する処理を書くことで解決することができました。
stackoverflowの記事だとlayoutSubviews
の中でlayoutIfNeeded
を呼ぶことで解決できるような事が書いてありますが、workaround感が強いため、まだdrawrectの方がマシな気がします。
override func draw(_ rect: CGRect) { super.draw(rect) imageView.layer.cornerRadius = imageView.frame.width / 2 imageView.layer.masksToBounds = true }
ちなみにこの問題はXcode 7では起きません。 ひょっとしたら次のXcodeのバージョンでは直っているかもしれませんのでご注意ください。