LoginSignup
14
12

More than 5 years have passed since last update.

UIButtonのタイトル文字をチラつかせず変更する + 便利プロパティ化

Last updated at Posted at 2016-06-04

役に立つかどうかよくわからない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()を入れてやることですかね

こうすることで文字だけが入れ替わります

ちなみに、
画像、背景画像、文字色なんかにも使えそうですね

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12