問題
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 件のコメント:
コメントを投稿