【Swift/UIKit】UIViewを明示的に再描画する方法!setNeedsDisplayなどの違い
この記事からわかること
- Swift/UIKitのUIViewクラスとは?
- 明示的に再描画させる方法
- setNeedsDisplayメソッドの使い方
- setNeedsLayout、layoutIfNeeded、layoutSubviewsの違い
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
参考文献:「setNeedsDisplay」、「setNeedsLayout」、「layoutIfNeeded」、「layoutSubviews」の違い
UIViewを明示的に再描画する方法
SwiftのUIViewクラスを明示的に再描画するためにはいくつかの方法があります。それぞれのメソッドの役割や挙動などをいまいち理解できていなかったのでまとめていきたいと思います。
UIView自体については以下の記事を参考にしてください。
こんなツリー構造になっていることも思い出しておくとスムーズです。
setNeedsDisplayメソッド
setNeedsDisplay
はビューのコンテンツを再描画する必要があることをシステムに通知するメソッドです。処理は非同期的に動作し、これにより内部的に再描画が必要であることがマークされ、次の描画サイクルのタイミングで対象のUIViewが再描画されます。そのため即座に再描画される訳ではないので注意してください。またメインスレッドから呼び出すことが推奨されています。
再描画が必要であることが通知してくれるのは呼び出したルートにあるUIViewのみであり、サブビューたちの分は通知してくれません。
setNeedsLayoutメソッド
setNeedsLayout
もsetNeedsDisplay
と同じビューのコンテンツを再描画する必要があることをシステムに通知するメソッドです。setNeedsDisplay
と異なるのは呼び出したビューの配下にある子や孫ビューも再描画対象として通知してくれる点です。こちらもメインスレッドから呼び出すことが推奨されています。
layoutIfNeededメソッド
layoutIfNeeded
メソッドは強制的に即座にレイアウトを更新し、再描画を行うメソッドです。呼び出したビューの配下にある子や孫ビューも再描画されます。こちらもメインスレッドから呼び出すことが推奨されています。
layoutSubviewsメソッド
layoutSubviews
は子ビューを再描画するメソッドです。このメソッドは直接使用することは非推奨であり、動作が期待と異なる場合のみオーバーライドして処理を追加する使い方が推奨されています。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。