タイトルの更新時にUIButtonが点滅しないようにする方法


85

UIButtonでsetTitleを呼び出すと、iOS 7でボタンが点滅します。myButton.highlighted= NOを設定しようとしましたが、ボタンの点滅が停止しませんでした。

[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];

myButton.highlighted = NO;

タイトルを更新するタイマーを設定する方法は次のとおりです。

- (void)actionTimer {
    if (myTimer == nil) {

        myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                        target: self
                        selector: @selector(showActivity)
                        userInfo: nil
                        repeats: YES];
    }
}

タイトルを実際に更新する方法は次のとおりです。

- (void)showActivity {

    NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

    if (pauseInterval == nil) {

        // Update clock
        seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;

        // Update total earned
        secRate = rate.value / 60 / 60;
        total = secRate * seconds;
        [totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];

        days = seconds / (60 * 60 * 24);
        seconds -= days * (60 * 60 * 24);
        int hours = seconds / (60 * 60);
        fhours = (float)seconds / (60.0 * 60.0);
        seconds -= hours * (60 * 60);
        int minutes = seconds / 60;
        seconds -= minutes * 60;

        // Update the timer clock
        [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    }
}

点滅してはいけません。バックグラウンドスレッドでこれを実行しようとしていますか?
BergQuester 2013年

はい、ボタンのタイトルを毎秒更新するようにタイマーで設定されています(独自のスレッドを作成すると思います)
FierceMonkey 2013年

タイマーは、そのように設定した場合にのみ、別のスレッドで実行されます。タイトルが更新される方法とタイマーの設定方法を教えてください。
BergQuester 2013年

リクエストされたコードをメインの質問に追加しました
FierceMonkey 2013年

回答:


205

ボタンタイプをUIButtonTypeCustomに設定すると、点滅が停止します


16
これは本当に好ましい答えです。最も簡単な解決策。そして、それは機能しています。
Johan Karlsson 2015年

4
同意しました。私は他の多くの解決策を試しましたが、これはすべてそれ自体でそれを行ったものです。
バーベキュースティーブ

2
これは受け入れられた答えでなければなりません。これまでで最も簡単な解決策。
マチャド2016

1
チャームのように機能します!ありがとう

2
そのためのコードを書かなくても、これは本当に良い解決策だと思います。
チャウヤン2017年

55

[UIView setAnimationsEnabled:NO]他のアニメーションに影響を与える可能性があるよりも優れたアプローチは、特定のタイトルアニメーションのみを無効にすることです。

Objective-C:

[UIView performWithoutAnimation:^{
  [myButton setTitle:text forState:UIControlStateNormal];
  [myButton layoutIfNeeded];
}];

迅速:

UIView.performWithoutAnimation { 
    myButton.setTitle(text, for: .normal)
    myButton.layoutIfNeeded()
}

ちょうど今、最新のiOSでSwiftソリューションを試しました-うまく機能します。
Ronen Rabinovici 2017年

1
日の救世主。乾杯!
pkc456 2017年

Swift 3でこれを試したところ、layoutIfNeeded()を使用しなくても機能します
user1898712 2017

3
これは間違いなく受け入れられた答えでなければなりません!
ジュリアス

1
これがこれを行うための最良の方法です。素晴らしい答えです!
aecend

29

*ご注意ください*

_buttonの" buttonType "が"UIButtonTypeSystem"の場合、以下のコードは無効です:

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

_buttonの" buttonType "が"UIButtonTypeCustom"の場合、上記のコードは有効です


19

タイトル変更時に不要なUIButtonアニメーションを停止する方法からの応答を参照してください

[UIView setAnimationsEnabled:NO];
[elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

7
@FierceMonkey layoutIfNeeded:に呼び出しを追加してみてください[elapsed layoutIfNeeded];。これにより、私の場合はまばたきがなくなりました。
クラース2014年

1
layoutIfNeededが私に代わってやってくれました。
カオリンファイアー

それはかなり汚い回避策のようだ、しかしlayoutIfNeeded仕事ができるように思われる
はPrzemyslawWrzesiński

7

後で簡単に使用できるように、UIButtonの別の関数を作成するだけです。

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

それだ!

そして、ちょうどあなたが前にそれに置き換わるものと同じようにタイトルセットsetTitleとをsetTitleWithoutAnimation


6

デフォルトの「setTitle」の動作は間違いなく嫌です!

私の解決策は次のとおりです。

[UIView setAnimationsEnabled:NO];
[_button layoutIfNeeded]; 
[_button setTitle:[NSString stringWithFormat:@"what" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

また、ストーリーボードのボタンのプロパティで、次のチェックを外します。

  • ハイライトで反転
  • ハイライトされた調整画像

そしてチェックしてください:

  • 無効画像の調整

iOS8でもテストおよび動作しています。

更新-Swift

カスタムボタンを作成し、setTitleメソッドをオーバーライドすることをお勧めします。

class UnflashingButton: UIButton {
   
    override func setTitle(title: String?, forState state: UIControlState) {
        UIView.setAnimationsEnabled(false)
        self.layoutIfNeeded()
        super.setTitle(title, forState: state)
        UIView.setAnimationsEnabled(true)
    }

}

私はこのアプローチを試しました(サブクラス化、setTitle:forState:のオーバーライド、UIView.setAnimationsEnabledの無効化-有効化)。iOS9および10ベータ版では機能しません。それは...私は唯一のアニメーションを無効にした場合に動作しますが、それらは、すべてのUIViewのために失われている
cdf1982

2

これを試してください。これは新しいバージョンのIOSで機能します。

class CustomButtonWithNoEffect : UIButton {
    override func setTitle(_ title: String?, for state: UIControlState) {
        UIView.performWithoutAnimation {
            super.setTitle(title, for: state)
            super.layoutIfNeeded()
        }
    }

}

0

私はコーディングとStackoverflowに慣れていないので、https://stackoverflow.com/users/4673064/daniel-tsengの優れた回答を拡張するために直接コメントするのに十分な評判がありません。だから私は自分の新しい答えを書かなければなりません、そしてそれはこれです:

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

以下を除いて、うまく機能します。

コードの後半で「setTitleWithoutAnimation」へのすべての呼び出しで送信者が指定されていない場合、CoreMediaまたはCoreDataに関連するこれらの奇妙なメッセージが表示されます(例:「2526からCoreMedia権限を継承できませんでした:(null)」)。

これはおそらくコーディングとiOSにとってかなり基本的なことですが、新しいコーダーとしての私にとっては、次のようにしばらくの間私をうさぎの道に送りました:今日の拡張機能はCoreMediaのアクセス許可を継承できませんでした、そこで人々は興味深い答えを持っていましたが、そうではありませんでした私の問題の根本に到達します。

そのため、最終的に、パラメーターのない関数にパラメーターを指定する必要があることに気付きました。つまり、送信者を指定する必要がありました。その送信者は、UIButton、Any、またはAnyObjectである可能性があります。これらはすべて機能しましたが、最終的には、ボタン拡張機能を「self」で追加することと、ボタンがそれを使用していることを後で具体的に言わないこととの間に矛盾があるようです。

繰り返しになりますが、おそらく基本的ですが、私にとっては新しいので、共有する価値があると思いました。


0

別のトリック

@IBOutlet private weak var button: UIButton! {
    didSet {
        button.setTitle(title, for: .normal)
    }
}

これは、API呼び出しを行わずにタイトルの値を知っている場合にのみ機能します。ボタンのタイトルは、ビューが読み込まれる前に設定されるため、アニメーションは表示されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.