web-dev-qa-db-ja.com

タイトル変更時に不要なUIButtonアニメーションを停止する方法は?

IOS 7では、UIButtonのタイトルが間違ったタイミングでアニメーション表示されます。この問題はiOS 6では発生しません。私はただ使用しています:

[self setTitle:text forState:UIControlStateNormal];

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

195
exsulto

これはカスタムボタンに対して機能します。

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

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

[_button layoutIfNeeded];
157
Jacob K

performWithoutAnimation:メソッドを使用してから、後でではなくすぐにレイアウトを強制的に実行します。

[UIView performWithoutAnimation:^{
  [self.myButton setTitle:text forState:UIControlStateNormal];
  [self.myButton layoutIfNeeded];
}];
244
Snowman

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

enter image description here

これは私のために働いた。

Swiftでは次を使用できます。

UIView.performWithoutAnimation {
    self.someButtonButton.setTitle(newTitle, forState: .normal)
    self.someButtonButton.layoutIfNeeded()
}
62
Paulw11

注意してください:

_buttonの「buttonType」が"UIButtonTypeSystem"の場合、以下のコードはinvalid

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

_buttonの「buttonType」が"UIButtonTypeCustom"の場合、上記のコードはvalidです。

59
shede333

IOS 7.1からは、ボタンがUIButtonTypeCustomタイプで初期化されたのが唯一の解決策でした。

50
Norbert

だから私は働いた解決策を見つけます:

_logoutButton.titleLabel.text = NSLocalizedString(@"Logout",);
[_logoutButton setTitle:_logoutButton.titleLabel.text forState:UIControlStateNormal];

最初にボタンのタイトルを変更してから、このタイトルのボタンのサイズを変更します

18
dubenko

ボタンの種類をUIButtonTypeCustomに設定すると、点滅が停止します

13
arunjos007

これを行うために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も同様である必要があります)

12
Xhacker Liu

UIButtonタイプをカスタムとして設定します。これにより、フェードインおよびフェードアウトのアニメーションが削除されます。

8
Amit Tandel

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

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

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

幸運を!

6
Mendy

通常、ボタンタイプをカスタムに設定するだけでうまくいきますが、他の理由で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では、ボタンの種類をシステムのままにしておくことができます。このアプローチを機能させるためにボタンの種類をカスタム型に変更する必要はありません。

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

6
cdf1982

Xhacker Liu回答のSwift 4バージョン

import Foundation
import UIKit
extension UIButton {
    func setTitleWithOutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
} 
3
faraz khonsari

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

    [[[theButton titleLabel] layer] removeAllAnimations];
3
Jacksonh

スイフト5

myButton.titleLabel?.text = "title"
myButton.setTitle("title", for: .normal)
1
Carter Randall

実際にタイトルをアニメーションブロックの外側に設定できます。performWithoutAnimation内でlayoutIfNeeded()を呼び出してください:

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.button1.layoutIfNeeded()
    self.button2.layoutIfNeeded()
    self.button3.layoutIfNeeded()
}

たくさんのボタンがある場合は、スーパービューでlayoutIfNeeded()を呼び出すことを検討してください。

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.view.layoutIfNeeded()
}
0
Senseful

この回避策はIButtonTypeSystemでも機能しますが、何らかの理由でボタンがenabledの場合にのみ機能することがわかりました。

[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)

0
sCha

UITabBarController内のView Controllerでボタンのタイトルを変更すると、animationいアニメーションの問題が発生しました。ストーリーボードに元々設定されていたタイトルは、新しい価値にフェードインする前に少しの間現れました。

すべてのサブビューを反復処理し、ボタンのタイトルをキーとして使用して、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インスペクターの)復元IDをタイトルと同じに設定し、タイトルの代わりにキーとして使用するようにします。

for(UIView *v in view.subviews) {

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

}

理想的ではありませんが、動作します。

0
Michael

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

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

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}
0
Paweł

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

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];
}
0
AppsolutEinfach