UIView animateWithDuration和UIProgressView setProgress

我想在10秒内将我的UIProgressView进度从0增加到1。

码:

 [UIView animateWithDuration:10.0 animations:^{ [_myProgressView setProgress:1 animated:YES]; } completion:(BOOL finished)^{ if (finished) NSLog(@"animation finished); }]; 

animation工作正常,除了完成和NSLog总是立即调用。

我尝试了animateWithDuration: withDelay:但延迟不被尊重和立即执行。

有没有人遇到同样的问题?

感谢您的帮助。

这是一个老问题,但我仍然在这里发布解决scheme。 解决scheme结果非常简单。 所有你需要做的是:

 [_myProgressView setProgress:1]; [UIView animateWithDuration:10.0 animations:^{ [_myProgressView layoutIfNeeded]; } completion:^(BOOL finished){ if (finished) NSLog(@"animation finished"); }]; 

这里有一个很好的解释,为什么事情为你工作不正确: http : //blog.spacemanlabs.com/2012/08/premature-completion-an-embarrassing-problem/

所以你不能使用setProgress:animated:方法为进度视图设置animation,并获得你想要的completion块行为。 但是,只是在块内设置progress将不会生成animation,因为progress不是一个可animation的属性。

请参阅苹果文件说明它的属性是必要的animation: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/clm/UIView/animateWithDuration:animation :

因此,您只需更新animate块之外的progress属性的值,然后在animate块中执行视图的布局。

简单地说,使用NSTimer就好,

 [progressview setProgress:0 animated:NO]; NSTimer *t=[NSTimer scheduledTimerWithTimeInterval: 1.0f target: self selector: @selector(progressupdate) userInfo: nil repeats: YES]; 

以下是更新进度的function,

 -(void)progressupdate{ if(progressview.progress<1){ [progressview setProgress:(progressview.progress+=0.2) animated:YES]; } else{ [t invalidate]; } } 

希望能帮助到你….

这是一个老问题,但我有一个类似的问题,这里是我的解决scheme(对不起,这是在斯威夫特)。 完成部分在animation结束时被调用。 它在一个自定义的UIProgressView类中。

 override func setProgress(progress: Float, animated: Bool) { self.progress = progress if animated { let duration: NSTimeInterval = 10.0 UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: { self.layoutIfNeeded() }, completion: { (completed) in self.animationDuration = nil }) } else { self.layoutIfNeeded() } } 

我发现的是一组UIviewanimation和进度视图animation,它们的工作更好,并顺利地为进度视图设置animation。 如果您只是使用animation和progressviewanimation的组合,则会直接触发,而不考虑UIviewanimation计时器。

 -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; timer = [NSTimer scheduledTimerWithTimeInterval: 1.0f target: self selector: @selector(updateTimer) userInfo: nil repeats: YES]; } - (void)updateTimer { if (progressView.progress >= 1.0) { [timer invalidate]; } [UIView animateWithDuration:1 animations:^{ float newProgress = [self.progressView progress] + 0.125; [self.progressView setProgress:newProgress animated:YES]; }]; } 

随意调整animation时间,以更好和平滑的过渡