有没有办法在倒数计时器中使用 UIButton 文本?

Posted

技术标签:

【中文标题】有没有办法在倒数计时器中使用 UIButton 文本?【英文标题】:Is there a way to use a UIButton for text in a countdown timer? 【发布时间】:2015-05-27 04:08:16 【问题描述】:

我是 ios 开发的新手,我正在编写一个带有倒数计时器的应用程序。我希望用户能够点击时间来设置它,所以我使用了UIButton,因为这似乎是最简单的事情。我在这个网站上看到了有关使用“UILabel”作为计时器并使用轻击手势来检测用户触摸“UILabel”的问题,但似乎大多数人建议使用UIButton

我遇到的问题是我将UIButton 文本初始化为 00:00,然后在用户选择时间时更改它。计时器设置为每 0.25 秒(重复)关闭一次,并且处理程序每​​次检测到时间已更改至少 1 秒时都会更新按钮中的文本。

我遇到的问题是在更新 UIButton 文本之间,UIButton 文本恢复到 00:00。例如,如果计时器设置为 10 分钟 (10:00),则 UIButton 文本执行以下操作: 10:00(开始)

00:00(大约 0.5 秒)

09:59(1 秒后)

00:00(大约 1.5 秒后)

如果我使用UILabel,则不会发生这种情况。以这种方式使用UIButton 是否存在固有问题?我应该只使用UILabel 并弄清楚如何做一个轻击手势吗?任何帮助将不胜感激!

这是我更新 UIButton 文本的代码(我正在使用通知事件):

- (void)timerChangedNotification:(NSNotification *)notification

    Timer *timer = (Timer *) notification.object;

    if ([[notification name] isEqualToString:@kGameClockTimer]) 
        NSInteger timeInMinutes = (timer.currentTimeInSeconds / 60) % 60;
        NSInteger timeInSeconds = timer.currentTimeInSeconds % 60;

        if ((self.lastTimeInMinutes != timeInMinutes) || (self.lastTimeInSeconds != timeInSeconds)) 
            self.lastTimeInMinutes = timeInMinutes;
            self.lastTimeInSeconds = timeInSeconds;
            // this label is to see if the same behavior happens using a label
            self.timerLabel.text = [NSString stringWithFormat:@"%02ld:%02ld",
                                            (long)timeInMinutes, timeInSeconds];
            self.timerButton.titleLabel.text = [NSString stringWithFormat:@"%02ld:%02ld",
                                (long)timeInMinutes, timeInSeconds];
        
    


编辑: 根据下面的一些 cmets,我在将“UIButton”设置为这样时更改了代码:

[self.timerButton setTitle:[NSString stringWithFormat:@"%02ld:%02ld", (long) timeInMinutes, (long) timeInSeconds] forState:UIControlStateNormal];

这确实让我更接近了,因为我在更新之间没有得到 00:00,但文本仍然在更新之间“闪烁”。我怀疑这与 forState 有关。我还需要为其他州设置标题吗?

编辑: 好的,我找到了解决“闪烁”按钮问题的方法。我不得不补充: [UIView setAnimationsEnabled:NO]; 在我的代码中。

感谢大家的帮助!

【问题讨论】:

你能贴一些代码吗? 对不起,我应该这样做的,但是已经很晚了,我很累。我更新了我的帖子。 【参考方案1】:

你想用按钮来显示倒计时吗?

我认为您可以使用以下方式。我试过了,它对我有用。

我有三个属性

@property(nonatomic,assign)NSInteger time;
@property (weak, nonatomic) IBOutlet UIButton *smsButton;
@property(nonatomic,strong)NSTimer *timer;

然后用一个方法启动定时器:

- (void)smsButtonPressed :(id)sender 

self.time = 60;
self.smsButton.enabled = NO;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

在 updateTime 方法中,您可以这样做:

- (void)updateTime 

if (self.time == 0) 

    [self resetTimer];

[self.smsButton setTitle:[NSString stringWithFormat:@"%ld",self.time] forState:UIControlStateDisabled];
self.time --;

使用上面的方法,我想你可以实现你想要实现的。

希望对您有所帮助。 :)

【讨论】:

这很有帮助。我确实更改了我的代码,但它并没有回到 00:00,但它仍然“闪烁”。在计时器处于活动状态时将按钮设置为禁用是否可以消除闪烁?我会尝试一下,看看它是否有任何效果。【参考方案2】:

我这样设置我的按钮标题,它可以正常工作而不会恢复。也许,您不小心在代码中还原了它?

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button addTarget:self
           action:@selector(action:)
 forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(0, 0, 220,40);

[button setTitle:@"string" forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
button.titleLabel.attributedText = [[NSAttributedString alloc] initWithString:@"string"     
attributes:@NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont fontWithName:@"Helvetica Neue" size:21.0f]];

【讨论】:

【参考方案3】:

使用 UIButton 应该没问题。但我认为你正在这样做

button.titleLabel.text = @"09:59";

而不是这个

[button setTitle:@"09:59" forState:UIControlStateNormal];

【讨论】:

谢谢!我确实尝试过,但我仍然会出现“闪烁”行为。查看我更新的帖子。

以上是关于有没有办法在倒数计时器中使用 UIButton 文本?的主要内容,如果未能解决你的问题,请参考以下文章

为 Android 实现 Firebase 服务器端倒数计时器?

如何创建在使用 AnimationController 创建的倒数计时器期间发出的警报?

颤振倒数计时器

有没有办法在 SwiftUI 中创建 WKExtendedRuntimeSession 的新会话?

如何使用倒数计时器停止游戏 - iOS [SWIFT] -

文本区字符倒计时