我不知道这里发生了什么。我有一个几乎完成的进度条,但没有显示它。如果我按.10
递增,它会停在.9
左右,看起来很直观,我可以弄清楚如何修复它。
float total = self.forms.count;
float calc = (float)self.progView.progress + (1 / total);
self.progView.progress = calc;
if (self.progView.progress == 1 )
{
sleep(2);
self.progView.hidden = YES;
self.progView.progress = 0;
}
我知道它会进入if语句,因为它会像这样睡2秒
修改
嗯,我拿出最后两行,它确实似乎更新了最后一部分,它一定是一个问题,我有一个块,它正在被调用?
即使这个方法包含在dispatch_async(dispatch_get_main_queue()
中,我仍然有问题。
主线程上的睡眠不好:
这是我的新工作代码:
if (self.progView.progress == 1 )
{
[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(removeProg) userInfo:nil repeats:NO];
}
方法
-(void)removeProg
{
self.progView.hidden = YES;
self.progView.progress = 0;
}
答案 0 :(得分:2)
这一切都与iOS中的绘图工作有关。当你要求时它不会发生。它发生在以后!界面更新只有我们来到“重绘时刻”。这只能在所有代码停止运行后发生。在此之前,更新界面的所有命令都是无意义的。当“重绘时刻”到来时,执行更新接口的所有累积命令。如果多个累积的命令影响接口的相同功能,则只计算最后一个。
让我们检查你的代码:
self.progView.progress = calc;
if (self.progView.progress == 1 )
{
sleep(2);
self.progView.hidden = YES;
self.progView.progress = 0;
}
我们说progress
是.9。现在您将progress
设置为calc
,让我们说calc
为1.但是还没有重绘时刻,因此界面不会改变。我们仍然看到温度计在.9。您的代码继续运行,并将progress
设置为0.现在您的代码结束。 现在有重绘时刻。因此温度计从.9跳到0而没有显示在1。
一个简单的并行实验是这样的:
myView.backgroundColor = [UIColor greenColor];
sleep(2);
myView.backgroundColor = [UIColor redColor];
你永远不会看到视图变成绿色,因为当重绘时刻到来时,最后一个命令是将其变为红色,这就是显示的内容。
从技术上讲,当运行时向您发送启动代码运行的事件时,将开始CATransaction。当所有代码完成运行并且运行时的原始事件完成后,CATransaction将被“提交”,我们将进行一系列清理。这包括完成所有累积绘图以及启动任何请求的动画。