iOS 7 では、UIButton のタイトルが間違ったタイミングでアニメーション化されます。この問題は iOS 6 では発生しません。
[self setTitle:text forState:UIControlStateNormal];
これが空白のフレームなしで即座に行われることを望みます。このまばたきは特に気を散らし、他のアニメーションから注意をそらします。
iOS 7 では、UIButton のタイトルが間違ったタイミングでアニメーション化されます。この問題は iOS 6 では発生しません。
[self setTitle:text forState:UIControlStateNormal];
これが空白のフレームなしで即座に行われることを望みます。このまばたきは特に気を散らし、他のアニメーションから注意をそらします。
これはカスタム ボタンで機能します。
[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];
システムボタンの場合、アニメーションを再度有効にする前にこれを追加する必要があります(@Klaasに感謝します):
[_button layoutIfNeeded];
Swift では、以下を使用できます。
UIView.performWithoutAnimation {
self.someButtonButton.setTitle(newTitle, forState: .normal)
self.someButtonButton.layoutIfNeeded()
}
ボタンの種類をカスタム フォーム インターフェイス ビルダーに変更します。
これは私にとってはうまくいきました。
iOS 7.1 以降、私にとって有効な唯一の解決策は、ボタンを type で初期化することでしたUIButtonTypeCustom
。
myButton.titleLabel?.text = "title"
myButton.setTitle("title", for: .normal)
ボタンのタイプを UIButtonTypeCustom に設定すると、点滅が止まります
これを行うために 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 は似ているはずです)
通常、ボタンの種類をカスタムに設定するだけでうまくいきますが、他の理由で 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 では、ボタンのタイプをシステムのままにしておくことができます。このアプローチを機能させるためにカスタム タイプに変更する必要はありません。
これが他の誰かに役立つことを願っています.私は迷惑な点滅ボタンに長い間苦労していたので、他の人にそれを避けたいと思っています;)
カスタムボタンを作成するだけで、タイトルの変更中にアニメーションが停止します。
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@"the title" forState:UIControlStateNormal];
ストーリーボードのチェックボックスでも実行できます: ストーリーボードのボタンを選択 -> 属性インスペクター (左側から 4 番目) を選択 -> [タイプ] ドロップダウン メニューで、おそらく選択された [システム] ではなく [カスタム] を選択します。 .
幸運を!
タイトル ラベルのレイヤーからアニメーションを削除できます。
[[[theButton titleLabel] layer] removeAllAnimations];
上記の優れた回答を組み合わせると、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];
}
Swift 3 に変換された Xhacker Liu 拡張機能:
extension UIButton {
func setTitleWithoutAnimation(title: String?) {
UIView.setAnimationsEnabled(false)
setTitle(title, for: .normal)
layoutIfNeeded()
UIView.setAnimationsEnabled(true)
}
}
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];
}
}
理想的ではありませんが、機能します..
この回避策は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)
ボタンのテキストのアニメーション化と変更で発生する問題を回避するには、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;}];