uiprogressview没有在视觉上完成100%

时间:2014-01-10 03:17:34

标签: ios objective-c

我不知道这里发生了什么。我有一个几乎完成的进度条,但没有显示它。如果我按.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秒 enter image description here

修改

嗯,我拿出最后两行,它确实似乎更新了最后一部分,它一定是一个问题,我有一个块,它正在被调用?

即使这个方法包含在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;
}

1 个答案:

答案 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将被“提交”,我们将进行一系列清理。这包括完成所有累积绘图以及启动任何请求的动画。