0

我在 Xcode 中编写了一个程序来显示时间。我想要一个矩形随着秒数的增加(时间的推移)动画/变长,并在秒数达到 60 时重新开始(并回到 0)。我没有故事板并且已经开始,所以我不想回去重新开始。

我应该使用UIView实例并为“框架”属性设置动画吗?

这是我的时钟代码:

- (void)viewDidLoad
{
[self updateTime];

[super viewDidLoad];

hourFormatter = [[NSDateFormatter alloc] init];
hourFormatter.dateFormat = @"HH";
minuteFormatter = [[NSDateFormatter alloc] init];
minuteFormatter.dateFormat = @"mm";
secondFormatter = [[NSDateFormatter alloc] init];
secondFormatter.dateFormat = @"ss";    
}

- (void)updateTime {

[updateTimer invalidate];
updateTimer = nil;

currentTime = [NSDate date];
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setTimeStyle:NSDateFormatterMediumStyle];

hourLabel.text = [hourFormatter stringFromDate: currentTime];
minuteLabel.text = [minuteFormatter stringFromDate: currentTime];
secondLabel.text = [secondFormatter stringFromDate: currentTime];

updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
}
4

1 回答 1

1

是的,您可以使用 aUIView并为其框架设置动画。

不过,您不一定要使用计时器来执行此操作,只需将动画设置为在整个持续时间和完整的帧高度变化中运行,然后使用计时器重新启动下一个动画。这将提供最流畅的动画。

要更新时间显示,您只需要一个每秒运行一次的计时器。

看看像这样运行动画:

CGRect frame = self.expandingTimeView.frame;
frame.height = 0;
self.expandingTimeView.frame = frame;

[UIView animateWithDuration:60
                 animations:^{
    frame.height = MAX_FRAME_HEIGHT;
    self.expandingTimeView.frame = frame;
}];

这里有一个很好的指南。

这段代码将进入您的updateTime方法,我假设每分钟都会被计时器调用一次。您需要更正expandingTimeView调用视图属性的名称,并且需要替换MAX_FRAME_HEIGHT为动画期间视图应增长到的最大高度。

您可能需要 2 个方法,1 个包含视图动画 ( updateTimeView),每分钟调用一次,1 个包含标签文本更新 ( updateTimeLabels),每秒调用一次。在这种情况下,应该创建 2 个计时器viewWillAppear:

于 2013-05-19T17:30:03.987 回答