役に立つかどうかよくわからないTipsシリーズ
UIButtonのタイトルをプログラムから動的に変える時どうしてますか?
hogeButton.setTitle("ほげほげ", forState: .Normal)
まぁ、こんな感じですよねぇ
ただ、これを実際動かすと、文字切替時にボタンがチラつくんですよ
勝手にクロスフェードエフェクトみたいなのがかかってしまうんですね
デフォルトでオシャレなエフェクトがつくのはいいんですけど
要らない時は要らない
いやむしろ要らない時のほうが多い
そんな邪魔な処理を取り除きつつ
もっとシンプルに実装できる方法が以下になります
extension UIButton {
/// ボタンのタイトルの取得/設定
var title: String? {
get {
return self.titleForState(.Normal)
}
set(v) {
UIView.performWithoutAnimation {
self.setTitle(v, forState: .Normal)
self.layoutIfNeeded()
}
}
}
}
こういうextensionを書くことによって
hogeButton.title = "ほげほげ"
おお、シンプル
そもそもボタンは基本的にNormalステータス時の文字列を設定することがほとんどですから
このプロパティは.Normal
に固定してしまっても構わないと思っています
いわば、Normalステータス専用プロパティです
それ以外のステータスを触りたければ
標準的なやり方であるsetTitle(_:forState:)
を使用するか
それ専用に別のメソッドを用意してやればいいわけです
こいつのミソは
UIView.performWithoutAnimation {
self.setTitle(v, forState: .Normal)
self.layoutIfNeeded()
}
冒頭の文字の邪魔なエフェクトによってチラつく現象のために
UIViewのperformWithoutAnimation(_:)
でアニメーションエフェクトをはずしてやって
layoutIfNeeded()
を入れてやることですかね
こうすることで文字だけが入れ替わります
ちなみに、
画像、背景画像、文字色なんかにも使えそうですね