在ios7中,我的UIButton标题在错误的时间动画进出——迟到。在iOS 6上不出现此问题。我用的是:

[self setTitle:text forState:UIControlStateNormal];

我更希望这能立即发生,而不是一个空白的框架。这种眨眼特别分散注意力,并将注意力从其他动画中转移开。


当前回答

结合以上的答案,可以为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个动画和2个按钮是一个更好的解决方案,以避免出现动画和更改按钮文本的问题?

我创建了第二个uibutton并生成了2个动画,这个解决方案没有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;}];

从iOS 7.1开始,唯一适合我的解决方案是用UIButtonTypeCustom类型初始化按钮。

通常简单地将按钮类型设置为自定义对我来说是有效的,但由于其他原因,我需要子类化UIButton并将按钮类型设置回默认(System),所以闪烁再次出现。

在改变标题之前设置UIView.setAnimationsEnabled(false),然后在那之后再次为true并没有避免我的闪烁,无论我是否调用self.layoutIfNeeded()。

在iOS 9和10测试版中,我只按以下顺序做到了这一点:

1)为UIButton创建一个子类(不要忘记在Storyboard中为按钮设置自定义类)。

2)重写setTitle:forState:如下:

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

    UIView.performWithoutAnimation({

        super.setTitle(title, forState: state)

        self.layoutIfNeeded()
    })
}

在Interface Builder中,您可以将按钮类型留给System,不需要将其更改为自定义类型以实现此方法。

我希望这能帮助其他人,我已经与烦人的闪烁按钮斗争了很长时间,我希望避免它对其他人;)

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

[[[button titleLabel] layer] removeAllAnimations];

    [UIView performWithoutAnimation:^{

        [button setTitle:@"Title" forState:UIControlStateNormal];

    }];

将按钮类型设置为UIButtonTypeCustom,它将停止闪烁