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时间,以更好和平滑的过渡