91

当我在 UIButton 上调用 setTitle 时,按钮在 iOS 7 中闪烁。我尝试设置 myButton.highlighted = NO,但这并没有阻止按钮闪烁。

[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];

myButton.highlighted = NO;

以下是我设置更新标题的计时器的方法:

- (void)actionTimer {
    if (myTimer == nil) {

        myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                        target: self
                        selector: @selector(showActivity)
                        userInfo: nil
                        repeats: YES];
    }
}

这是实际更新标题的方法:

- (void)showActivity {

    NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

    if (pauseInterval == nil) {

        // Update clock
        seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;

        // Update total earned
        secRate = rate.value / 60 / 60;
        total = secRate * seconds;
        [totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];

        days = seconds / (60 * 60 * 24);
        seconds -= days * (60 * 60 * 24);
        int hours = seconds / (60 * 60);
        fhours = (float)seconds / (60.0 * 60.0);
        seconds -= hours * (60 * 60);
        int minutes = seconds / 60;
        seconds -= minutes * 60;

        // Update the timer clock
        [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    }
}
4

9 回答 9

229

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

于 2014-08-02T14:49:34.990 回答
62

可能会影响其他动画的更好方法[UIView setAnimationsEnabled:NO]是仅禁用特定的标题动画。

目标-C:

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

迅速:

UIView.performWithoutAnimation { 
    myButton.setTitle(text, for: .normal)
    myButton.layoutIfNeeded()
}
于 2016-08-22T04:57:21.470 回答
30

*请注意 *

当_button的“ buttonType ”为“UIButtonTypeSystem”时,下面的代码无效:</p>

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

当_button的“ buttonType ”为“UIButtonTypeCustom”时,上述代码有效

于 2013-12-21T11:32:25.300 回答
19

请参阅如何在标题更改时停止不需要的 UIButton 动画的响应?:

[UIView setAnimationsEnabled:NO];
[elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];
于 2013-11-01T04:54:47.380 回答
8

您可以简单地为 UIButton 制作另一个函数,以便将来使用。

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

这就对了!

并像以前一样设置标题,但替换setTitlesetTitleWithoutAnimation

于 2017-06-19T23:36:30.127 回答
7

默认的“setTitle”行为绝对是可恶的!

我的解决方案是:

[UIView setAnimationsEnabled:NO];
[_button layoutIfNeeded]; 
[_button setTitle:[NSString stringWithFormat:@"what" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

另外,在情节提要中,在按钮的属性下,我取消选中:

  • 高光反转
  • 突出显示调整图像

并检查:

  • 禁用调整图像

在iOS 8上也经过测试和工作。

更新 - 斯威夫特

我建议您创建自定义按钮并覆盖setTitle方法。

class UnflashingButton: UIButton {
   
    override func setTitle(title: String?, forState state: UIControlState) {
        UIView.setAnimationsEnabled(false)
        self.layoutIfNeeded()
        super.setTitle(title, forState: state)
        UIView.setAnimationsEnabled(true)
    }

}
于 2014-12-18T14:08:24.167 回答
2

试试这个,这适用于较新版本的 IOS:

class CustomButtonWithNoEffect : UIButton {
    override func setTitle(_ title: String?, for state: UIControlState) {
        UIView.performWithoutAnimation {
            super.setTitle(title, for: state)
            super.layoutIfNeeded()
        }
    }

}
于 2018-09-27T20:10:45.240 回答
0

另一个技巧

@IBOutlet private weak var button: UIButton! {
    didSet {
        button.setTitle(title, for: .normal)
    }
}

这仅在您知道标题的值而不进行任何 API 调用时才有效。按钮的标题将在视图加载之前设置,因此您不会看到动画

于 2019-01-09T21:21:23.687 回答
0

我是编码和 Stackoverflow 的新手,所以没有足够的声誉来直接评论以扩展https://stackoverflow.com/users/4673064/daniel-tseng出色的答案。所以我必须写我自己的新答案,就是这样:

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

效果很好,除了:

如果我稍后在代码中对“setTitleWithoutAnimation”的所有调用都没有指定发件人,那么我会收到这些与 CoreMedia 或 CoreData 相关的奇怪消息,例如“无法从 2526 继承 CoreMedia 权限:(null)”

这对于编码和 iOS 来说可能是非常基础的,但对于我作为一个新编码员来说,它让我在兔子路上走了一段时间,例如:Today Extension Failed to inherit CoreMedia permissions from,人们有有趣的答案,但没有找到我问题的根源。

所以我终于发现我必须通过并给我的无参数函数参数,即我必须指定一个发送者。该发送者可以是 UIButton、Any 或 AnyObject。所有这些都有效,但最终在添加带有“self”的按钮扩展名和稍后没有具体说明按钮正在使用它之间似乎存在冲突。

同样,可能是基本的,但对我来说是新的,所以我认为它值得分享。

于 2018-04-05T22:39:57.413 回答