如何停止对标题更改不需要的UIButtonanimation?

在iOS 7中,我的UIButton标题在错误的时间进行animation处理 – 迟到。 这个问题不会出现在iOS 6上。我只是使用:

[self setTitle:text forState:UIControlStateNormal]; 

我宁愿立即发生这种情况,没有空​​白的框架。 这种眨眼特别让人分心,并将注意力从其他animation中吸引过来。

这适用于自定义button:

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

对于系统button,您需要在重新启用animation之前添加该button(谢谢@Klaas):

 [_button layoutIfNeeded]; 

使用performWithoutAnimation:方法,然后强制布局立即发生,而不是稍后。

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

请注意 :

_button的buttonType ”是“UIButtonTypeSystem”时 ,下面的代码无效

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

_button的buttonType ”是“UIButtonTypeCustom”时 ,上面的代码是有效的

从iOS 7.1开始,唯一的解决scheme是使用UIButtonTypeCustomtypes初始化button。

将buttontypes更改为自定义表单界面构build器。

在这里输入图像说明

这对我有效。

在Swift中你可以使用:

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

所以我find工作解决scheme:

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

首先我们改变button的标题,然后调整这个标题的button

我做了一个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应该是相似的)

将buttontypes设置为UIButtonTypeCustom,它将停止闪烁

你可以简单地创build自定义button,它将停止animation,而改变标题。

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

你也可以在Storyboardcheckbox中进行操作:selectstoryboard中的button – 在'Type'下拉菜单中select属性检查器(左边第四个) – >,select'Custom'而不是'System' 。

祝你好运!

您可以从标题标签的图层中删除animation:

  [[[theButton titleLabel] layer] removeAllAnimations]; 

我发现这个解决方法也适用于UIButtonTypeSystem ,但只有在某些原因启用了button的情况下才能工作。

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

所以如果你在设置标题时需要禁用button的话,你必须添加这些。

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

(iOS 7,Xcode 5)

当在UITabBarController中的视图控制器中更改button标题时,我遇到了难看的animation问题。 最初在故事板中设置的标题显示了一段时间,然后才淡入新的价值观。

我想遍历所有的子视图,并使用button标题作为关键字来获取他们的本地化值与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]; } } 

我发现触发animation的实际上是对btn.titleLabel.text的调用。 因此,为了仍然使用故事板并使组件像这样dynamic地本地化,我确保将每个button的恢复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]; } } 

不理想,但工程..

实际上你可以在animation块外面设置标题,只要确保在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() } 

如果你有一堆button,可以考虑在超级视图上调用layoutIfNeeded()

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

通常简单地将buttontypes设置为自定义适用于我,但由于其他原因,我需要inheritanceUIButton并将buttontypes设置为默认(系统),所以闪烁再次出现。

在更改标题之前设置UIView.setAnimationsEnabled(false) ,然后再次设置为true不会避免闪烁,无论我是否调用self.layoutIfNeeded()

这一点,只有以下的确切顺序,为我工作与iOS 9和10testing版:

1)为UIButton创build一个子类(不要忘记在Storyboard中也设置button的自定义类)。

2)覆盖setTitle:forState:如下:

 override func setTitle(title: String?, forState state: UIControlState) { UIView.performWithoutAnimation({ super.setTitle(title, forState: state) self.layoutIfNeeded() }) } 

在界面生成器中,您可以将buttontypes保留为“系统”,无需将其更改为“自定义types”即可使用此方法。

我希望这可以帮助别人,我用这种烦人的闪烁的button努力了很久,我希望避免给别人;)

Xhacker Liu扩展转换为Swift 3:

 extension UIButton { func setTitleWithoutAnimation(title: String?) { UIView.setAnimationsEnabled(false) setTitle(title, for: .normal) layoutIfNeeded() UIView.setAnimationsEnabled(true) } } 

结合上面的很好的答案导致以下解决方法为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]; } 

也许生成2个animation和2个button是一个更好的解决scheme,以避免与animation和改变一个button的文本出现的问题?

我创build了第二个uibutton并生成了2个animation,这个解决scheme没有hickup。

  _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;}]; 

我得到它的工作与答案的组合:

 [[[button titleLabel] layer] removeAllAnimations]; [UIView performWithoutAnimation:^{ [button setTitle:@"Title" forState:UIControlStateNormal]; }];