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