有没有办法在倒数计时器中使用 UIButton 作为文本?
Is there a way to use a UIButton for text in a countdown timer?
我是 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];
}
}
}
编辑:
根据下面的一些评论,我在设置 'UIButton' 时更改了代码:
[self.timerButton setTitle:[NSString stringWithFormat:@"%02ld:%02ld", (long) timeInMinutes, (long) timeInSeconds] forState:UIControlStateNormal];
这确实让我更接近了,因为我没有在更新之间得到 00:00,但在更新之间文本仍然是 "blinks"。我怀疑它与 forState 有关。我是否也需要为其他州设置标题?
编辑:
好的,我通过按钮 "blinking" 找到了解决我的问题的方法。我不得不补充:
[UIView setAnimationsEnabled:NO];
在我的代码中。
感谢大家的帮助!
我这样设置了我的按钮标题,它可以正常工作而不会还原。也许,您不小心在代码中还原了它?
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]}];
您应该可以使用 UIButton。但我认为你正在这样做
button.titleLabel.text = @"09:59";
而不是这个
[button setTitle:@"09:59" forState:UIControlStateNormal];
您想使用按钮来倒计时吗?
我想你可以用下面的方法。我试过了,对我有用。
我有三个属性
@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 --;
}
使用上面的方法,我想你可以实现你想要实现的。
希望对您有所帮助。 :)
我是 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];
}
}
}
编辑: 根据下面的一些评论,我在设置 'UIButton' 时更改了代码:
[self.timerButton setTitle:[NSString stringWithFormat:@"%02ld:%02ld", (long) timeInMinutes, (long) timeInSeconds] forState:UIControlStateNormal];
这确实让我更接近了,因为我没有在更新之间得到 00:00,但在更新之间文本仍然是 "blinks"。我怀疑它与 forState 有关。我是否也需要为其他州设置标题?
编辑:
好的,我通过按钮 "blinking" 找到了解决我的问题的方法。我不得不补充:
[UIView setAnimationsEnabled:NO];
在我的代码中。
感谢大家的帮助!
我这样设置了我的按钮标题,它可以正常工作而不会还原。也许,您不小心在代码中还原了它?
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]}];
您应该可以使用 UIButton。但我认为你正在这样做
button.titleLabel.text = @"09:59";
而不是这个
[button setTitle:@"09:59" forState:UIControlStateNormal];
您想使用按钮来倒计时吗?
我想你可以用下面的方法。我试过了,对我有用。
我有三个属性
@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 --;
}
使用上面的方法,我想你可以实现你想要实现的。
希望对您有所帮助。 :)