自iOS 5问世以来,我对进度条有点麻烦。下面的代码在iOS 5之前工作正常,但在iOS 5中,进度条不再显示循环中设置的新进度。
代码应该像这样工作:
以下是条形码init的代码:
// create a progress bar
UIProgressView *progressBar = [[UIProgressView alloc] initWithFrame:CGRectMake(coverSizeX*0.25, coverSizeY - 34.0, coverSizeX*0.5, 9.0)];
progressBar.progress = 0.0;
progressBar.progressViewStyle = UIProgressViewStyleBar;
并且在另一个线程中,它将进度的起点设置为0.25:
// set an initial progress
[progressBar setProgress: 0.25];
稍后它会在循环中更新进度以显示下载进度:
// within a for-loop:
NSNumber *counterPercentage;
for ( pageDownload = 1; pageDownload < pagesToDownload; pageDownload++ ) {
counterPercentage = [[NSNumber alloc] initWithFloat: (float)pageDownload / (float)((float)pagesToDownload)];
[progressBar setProgress: [counterPercentage floatValue]];
[progressBar performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
}
...但是屏幕上没有显示进度,进度条停留在设置的初始0.25进度上。
iOS 5版本是否有任何可能破坏它的变化?
答案 0 :(得分:18)
自iOS 5开关以来,我已经看过很多像这样的问题了,我不知道为什么只有iOS 5出现问题。但主要是因为我不确定为什么没有之前的问题。
在您的代码中,您从后台线程调用[progressBar setProgress: [counterPercentage floatValue]];
。这是一个UI调用,不应该从后台线程进行。您也可以拨打setNeedsDisplay
来更新progressBar
,因为UIProgressView
知道如何展示自己。 iOS 5似乎已经使更新UI的要求更加严格,但仅限于最佳实践。
在我看来,这看起来像块的完美用途。使用块你的for循环可以这样写:
for ( pageDownload = 1; pageDownload < pagesToDownload; pageDownload++ ) {
// Other stuff in background
dispatch_async(dispatch_get_main_queue(), ^{
progressBar.progress = ((float)pageDownload/(float)pagesToDownload);
});
// Other stuff in backgroud
}
答案 1 :(得分:2)
它在iOS 5中运行,最简单的方法是:
.h文件:
IBOutlet UIProgressView *WhateverYouWantToCallIt;
.m文件:
[WhateverYouWantToCallIt setProgress:(float) 0.3];
如果它说0.3,你可以放任何你喜欢的值(在0到1之内)