iOSエンジニアのつぶやき

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

ちょこっと StackView のパフォーマンスを気にしてあげる

今回は StackView で限定された数のリストを繰り返し更新して表示する際に、ちょこっとパフォーマンスが良くなる方法を紹介したいと思います。

UITableViewCell に StackView を持っている時の実装を行っていきます。

    @IBOutlet private weak var stackView: UIStackView!

    private let displayLimit = 3

    override func awakeFromNib() {
        super.awakeFromNib()
        for _ in 1...displayLimit { stackView.addArrangedSubview(CustomeView()) }
    }

これで、初期化時に StackView に CustomeView() が3つ追加されるようになります。 次に Cell を更新するためのメソッドを書いていきます。

    @IBOutlet private weak var stackView: UIStackView!

    private let displayLimit = 3

    override func awakeFromNib() {
        super.awakeFromNib()
        for _ in 1...displayLimit { stackView.addArrangedSubview(CustomeView()) }
    }

    func set(list: [CustomeViewData]) {
        for (index, subview) in stackView.subviews.enumerated() {
            if let customeView = subview as? CustomeView, let data = list[safe: index] {
                subview.isHidden = false
                customeView.iconImage = data.iconImage
                customeView.name = data.name
            } else {
                subview.isHidden = true
            }
        }
    }

これで、List に含まれるデータに応じて StackView を可変に変更できるようになりました🎉

更新頻度が極めて少ない View などで使用する場合や StackView の階層が1つの場合は、その都度 StackView をリセットし、addArrangedSubview をしてもほとんど問題はありませんが、更新頻度が高い場合などは今回のように中身だけ更新できるようにすることで、StackView の AutoLayout による遅延が最小ですむのでパフォーマンスコストを削減できそうですね。また、今回はリミットを3件のみに限定しているため SubView を全て更新していますが、差分のみを更新できるようにするとさらに良さそうです。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com