2018年2月9日金曜日

UIButtonのタイトル変更時のチラつき防止

問題

UIButtonのtitleTextを変更すると、表示がチラついてしまう。

たとえば以下のようにいくつもあるボタンのtitleTextを一斉に変えようとする場合などに、特に気にかかる。
最初にボタンの isHidden = true にしておき、titleText変更後に isHidden = false にしてもダメ。

for btn in buttonArray {
    btn.setTitle("ちんぴょろすぽーん", for: .normal)
}

解決方法

UIViewのアニメーションを切っておき、その間にtitleTextを変更、最後にアニメーションを許可すればよし。
肝心なことは、ボタンに対し layoutIfNeeded() を指示しておくこと。これやらないとやっぱりチラつく。

UIView.setAnimationsEnabled(false)
for btn in buttonArray {
    btn.setTitle("ちんぴょろすぽーん", for: .normal)
    btn.layoutIfNeeded()
}
UIView.setAnimationsEnabled(true)


layoutIfNeeded()ってのは、「レイアウトのアップデートが保留中だったら、すぐにSubviewをレイアウトしろ」ってメソッド。
すぐに…なんていうと、アニメーションの設定が false でも更新されてしまいそうだけど、そこは ifNeeded 必要になったら…ってことで、アニメの設定が true になるまで待ってくれるんだろう。
titleTextの変更も、ボタンの大きさが変更される要因の一つなので、こうしたレイアウト関係のメソッドで処理するんだろうね。

なおこのメソッドはメインスレッドからしか呼べない。(iOSの仕様上、UIの操作はメインスレッドからしか処理できないため)

0 件のコメント:

コメントを投稿