После изучения нескольких вариантов я решил использовать UIProgressView (предложенный sudo в комментариях) в сочетании с NSTimer, который обновляет прогресс десять раз в секунду в течение десяти секунд, я использовал это решение, потому что:
- Это стандартный элемент, предоставленный яблоком.
- Эта опция не требует дополнительных затрат на создание и загрузку 100 изображений (как предложил Криптон в комментариях).
- С помощью NSTimer я могу добавить проверку в функцию updateProgressBar, чтобы добавить некоторую обратную связь с пользователем, когда таймер достигает низкого уровня, например, вибрация в течение последних трех секунд и т. Д. (Используя анимацию, я бы не сталиспользуйте эту опцию).
Используя приведенный ниже код, предположим, что у меня есть переменная UIProgressView с именем «progressView», NSTimer с именем «timer» и переменная с плавающей точкой с именем «time», тогда:
-(void)updateProgressBar
{
if(time <= 0.0f)
{
//Invalidate timer when time reaches 0
[timer invalidate];
}
else
{
time -= 0.01;
progressView.progress = time;
}
}
-(void)animateProgressView2
{
progressView.progress = 1;
time = 1;
timer = [NSTimer scheduledTimerWithTimeInterval: 0.1f
target: self
selector: @selector(updateProgressBar)
userInfo: nil
repeats: YES];
}
Другой способ, которым я исследовал (после просмотра комментариев Диско), но решил не использовать анимацию.В этом случае я создал два png-изображения с именами «redbar.png» и «greenbar.png», идея которых заключается в том, что они будут размещены друг над другом (зеленая полоса находится сверху / на переднем плане) и на протяжениианимация, когда зеленая полоса сжимается, показывая красную полосу на заднем плане.
UIImage *green= [UIImage imageNamed:@"greenbar.png"];
UIImage *red= [UIImage imageNamed:@"redbar.png"];
redBar.image = red; // allocate the red image to the UIImageView
redBar.frame = CGRectMake(20,250,220,30);// set the size of the red image
greenBar.image = green; // allocate the green image to the UIImageView
greenBar.frame = CGRectMake(20,250,220,30);//set the size of the green image
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:10]; //the time you want the animation to last for
[UIView setAnimationDidStopSelector:@selector(animationFinished)];//the method to be called once the animation is finished
//at the end of the animation we want the greenBar frame to disappear
greenBar.frame = CGRectMake(20,250,0,30);
[UIView commitAnimations];
Идеальным решением было бы объединить UIProgressView и блок UIAnimation, но в настоящее время это не вариант (см. этот вопрос оживить изменения UIProgressView ).
Надеюсь, это поможет кому-то в будущем.
EDIT ::
Похоже, идеальное решение, о котором я упоминал выше, теперь доступно в iOS5, взято с эталонного сайта Apple:
setProgress: animated: регулирует текущий прогресс, отображаемый приемником, при желании анимируя изменения.
- (void) setProgress: (float) анимированный прогресс: (BOOL) animated