iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

UIView の updateConstraints() について知る

今回は View の制約を更新する際などに登場する updateConstraints() について簡単にまとめていきます🙃

なんのメソッド?

このメソッドはUIView のインスタンスメソッドで、View の制約を更新する際に呼び出します。基本的にはシステム側がレイアウトパフォーマンスを考慮したタイミングで呼び出すので、開発者が意図的に呼び出してはいけません。

いつ使うのか?

ある View に指定する制約が遅くパフォーマンスに影響を与える場合や冗長な変更を多数している場合にのみ、UIView のサブクラスでメソッドを Override して使用します。また、更新処理の最後でsuper.updateConstraints() を呼び出す必要があります。

    override func updateConstraints() {
        //
        // 制約の更新
        //
        super.updateConstraints()
    }

基本的には、あるアクションに伴う制約の更新などをする際は逐次そのスコープで制約を更新した方がシンプルですが、先述の通りパフォーマンスを大きく損なうような制約の更新などの場合は updateConstraint() 内で行なった方がいいよ〜とのことです🙃これは、updateConstraint() がレイアウトののバッチ処理を行いメインスレッドをブロックしないためです。

意図的に呼び出したい場合は?

setNeedsUpdateConstraints() という UIView のインスタンスメソッドを使用して、制約更新のフラグをつけることができます。これによって、指定された View とその Subviews がシステムのタイミングによって updateConstraint() を呼ぶようになります。また、更新を即座に行う必要がある場合には updateConstraintsIfNeeded() を使うことで即座に制約更新を行わせることができます。

参考