ラベル Button の投稿を表示しています。 すべての投稿を表示
ラベル Button の投稿を表示しています。 すべての投稿を表示

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の操作はメインスレッドからしか処理できないため)

2015年11月16日月曜日

UIButtonの画像のアニメーション

UIImageViewに表示するUIImageはパラパラアニメができるけど、UIButtonに表示する画像もアニメーションができる。
これで、点滅するボタンとかが作れるわけだ。

UIButtonに画像を表示する機能はUIImageViewを使ってるようで、UIButtonのimageViewプロパティにアクセスする。
このプロパティ、リファレンスを読むとreadOnlyってなってるんだけど、さらにその配下にあるanimationImagesなどのプロパティには値をセットすることができる。

やり方はUIImageViewと一緒で、アニメのコマを入れた配列を用意し、animationImagesに設定。
Duration(時間)やRepeatCount(繰り返し回数。0だと無限繰り返し)を設定し、startAnimation()関数で開始する。

唯一注意点はUIButtonのsetImage()関数で、UIButtonに画像を表示する設定にしてやることだ。
通常の、文字だけ表示する設定じゃダメってことね。

        let imageArray:[UIImage] = [
            UIImage(named: "image01")!,
            UIImage(named: "image02")!
        ]
        animeBtn.setImage(imageArray[0], forState: .Normal) //これ必要
        animeBtn.imageView?.animationImages = imageArray
        animeBtn.imageView?.animationDuration = 1.0
        animeBtn.imageView?.animationRepeatCount = 0

        animeBtn.imageView?.startAnimating()