236

iOS 7 では、UIButton のタイトルが間違ったタイミングでアニメーション化されます。この問題は iOS 6 では発生しません。

[self setTitle:text forState:UIControlStateNormal];

これが空白のフレームなしで即座に行われることを望みます。このまばたきは特に気を散らし、他のアニメーションから注意をそらします。

4

24 に答える 24

169

これはカスタム ボタンで機能します。

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

システムボタンの場合、アニメーションを再度有効にする前にこれを追加する必要があります(@Klaasに感謝します):

[_button layoutIfNeeded];
于 2013-10-10T18:42:05.970 に答える
101

Swift では、以下を使用できます。

UIView.performWithoutAnimation {
    self.someButtonButton.setTitle(newTitle, forState: .normal)
    self.someButtonButton.layoutIfNeeded()
}
于 2015-12-09T00:43:20.997 に答える
95

ボタンの種類をカスタム フォーム インターフェイス ビルダーに変更します。

ここに画像の説明を入力

これは私にとってはうまくいきました。

于 2015-04-08T08:21:07.833 に答える
55

iOS 7.1 以降、私にとって有効な唯一の解決策は、ボタンを type で初期化することでしたUIButtonTypeCustom

于 2014-04-22T20:52:37.087 に答える
20

スイフト5

myButton.titleLabel?.text = "title"
myButton.setTitle("title", for: .normal)
于 2019-07-05T21:15:51.537 に答える
14

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

于 2016-02-10T09:29:32.510 に答える
14

これを行うために Swift 拡張機能を作成しました。

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, forState: .Normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

iOS 8 および 9 で動作しUIButtonTypeSystemます。

(コードは Swift 2 用で、Swift 3 と Objective-C は似ているはずです)

于 2015-07-30T22:22:46.800 に答える
9

通常、ボタンの種類をカスタムに設定するだけでうまくいきますが、他の理由で UIButton をサブクラス化し、ボタンの種類をデフォルト (システム) に戻す必要があったため、点滅が再発しました。

タイトルを変更する前に設定UIView.setAnimationsEnabled(false)し、その後再度trueに設定しても、電話をかけたかどうかに関係なく、点滅を回避できself.layoutIfNeeded()ませんでした。

これは、次の正確な順序でのみ、iOS 9 および 10 ベータ版で機能しました。

1) UIButton のサブクラスを作成します (ストーリーボードにもボタンのカスタム クラスを設定することを忘れないでください)。

2) 次のようにオーバーライドsetTitle:forState:します。

override func setTitle(title: String?, forState state: UIControlState) {

    UIView.performWithoutAnimation({

        super.setTitle(title, forState: state)

        self.layoutIfNeeded()
    })
}

Interface Builder では、ボタンのタイプをシステムのままにしておくことができます。このアプローチを機能させるためにカスタム タイプに変更する必要はありません。

これが他の誰かに役立つことを願っています.私は迷惑な点滅ボタンに長い間苦労していたので、他の人にそれを避けたいと思っています;)

于 2016-08-09T10:00:38.560 に答える
6

カスタムボタンを作成するだけで、タイトルの変更中にアニメーションが停止します。

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"the title" forState:UIControlStateNormal];

ストーリーボードのチェックボックスでも実行できます: ストーリーボードのボタンを選択 -> 属性インスペクター (左側から 4 番目) を選択 -> [タイプ] ドロップダウン メニューで、おそらく選択された [システム] ではなく [カスタム] を選択します。 .

幸運を!

于 2014-06-16T11:06:00.303 に答える
3

タイトル ラベルのレイヤーからアニメーションを削除できます。

    [[[theButton titleLabel] layer] removeAllAnimations];
于 2014-04-23T17:47:56.020 に答える
0

上記の優れた回答を組み合わせると、UIButtonTypeSystemの次の回避策が得られます。

if (_button.enabled)
{
    [UIView setAnimationsEnabled:NO];
    [_button setTitle:@"title" forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
}
else // disabled
{
    [UIView setAnimationsEnabled:NO];
    _button.enabled = YES;
    [_button setTitle:@"title" forState:UIControlStateNormal];
    _button.enabled = NO;
    [UIView setAnimationsEnabled:YES];
}
于 2014-02-18T14:36:04.007 に答える
0

Swift 3 に変換された Xhacker Liu 拡張機能:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}
于 2016-11-03T12:42:23.697 に答える
0

UITabBarController 内のビュー コントローラーでボタンのタイトルを変更すると、アニメーションの見苦しい問題が発生しました。もともと絵コンテに設定されていたタイトルは、新しい値にフェードする前に、しばらくの間表示されました。

すべてのサブビューを反復処理し、ボタンのタイトルをキーとして使用して、NSLocalizedString でローカライズされた値を取得したいと考えました。

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.titleLabel.text, nil);
        [btn setTitle:newTitle];
    }

}

アニメーションをトリガーしているのは、実際には btn.titleLabel.text の呼び出しであることがわかりました。したがって、引き続きストーリーボードを利用し、このようにコンポーネントを動的にローカライズするには、すべてのボタンの復元 ID (Identity Inspector 内) をタイトルと同じに設定し、それをタイトルの代わりにキーとして使用するようにします。

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.restorationIdentifier, nil);
        [btn setTitle:newTitle];
    }

}

理想的ではありませんが、機能します..

于 2014-05-24T21:35:39.967 に答える
0

この回避策はUIButtonTypeSystemでも機能することがわかりましたが、何らかの理由でボタンが有効になっている場合にのみ機能します。

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

したがって、タイトルを設定するときにボタンを無効にする必要がある場合は、これらを追加する必要があります。

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

(iOS 7、Xcode 5)

于 2014-02-11T12:59:06.527 に答える
-2

ボタンのテキストのアニメーション化と変更で発生する問題を回避するには、2 つのアニメーションと 2 つのボタンを生成する方が良い解決策でしょうか?

2 つ目の uibutton を作成し、2 つのアニメーションを生成しました。このソリューションは問題なく動作します。

    _button2.hidden = TRUE;
    _button1.hidden = FALSE;

    CGPoint startLocation = CGPointMake(_button1.center.x, button1.center.y - 70);
    CGPoint stopLocation  = CGPointMake(_button2.center.x, button2.center.y- 70);


    [UIView animateWithDuration:0.3 animations:^{ _button2.center = stopLocation;} completion:^(BOOL finished){_button2.center = stopLocation;}];
    [UIView animateWithDuration:0.3 animations:^{ _button1.center = startLocation;} completion:^(BOOL finished){_button1.center = startLocation;}];
于 2014-03-13T20:29:12.340 に答える