2014-01-10 2 views
1

여기에서 무슨 일이 일어나는지 모르겠습니다. 진행률 표시 줄이 거의 완성되었지만 표시되지 않습니다. 내가 .10에 의해 증가했다면, 그것은 .9에 멈추거나 시각적으로 보였고 그것을 고치는 방법을 알 수 있습니다.uiprogressview가 시각적으로 100 %로 완료되지 않습니다.

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; 
    } 

는 나는이 enter image description here

편집 등의 2 초 동안 잠을하기 때문에 그것은 if 문에 들어가는 알고

흠 내가 마지막 두 행을 가져다가 보인다 마지막 부분을 업데이트하려면 블록에서 문제가되어야합니다. 호출 된 블록이 있습니까?

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

주 스레드에서 절대로 절전 모드로 전환하지 마십시오. Ver 나쁜. – rmaddy

+0

비슷한 문제가있어서 만족스런 결론을 얻을 수있었습니다. – Bill

답변

2

iOS. 당신이 그것을 요구할 때 그것은 일어나지 않습니다. 나중에 일어난다! 인터페이스가 업데이트되어 "다시 그리기"가됩니다. 이것은 모든 코드가 실행을 중지 한 후에 만 ​​발생할 수 있습니다. 인터페이스를 업데이트하기위한 모든 명령은 그때까지 의미가 없습니다. "다시 그리기"가 시작되면 누적 된 명령을 실행하여 인터페이스를 업데이트합니다. 누적 된 명령이 인터페이스의 동일한 기능에 영향을주는 경우 마지막 명령 만 계산됩니다.

그럼이 코드를 살펴 보자 :

self.progView.progress = calc; 
if (self.progView.progress == 1) 
{ 
    sleep(2); 
    self.progView.hidden = YES; 
    self.progView.progress = 0; 
} 

이의이 progress는 0.9이었다 가정 해 봅시다. 이제 progresscalc으로 설정하고 calc이 1이라고 가정 해 보겠습니다. 그러나 다시 그리는 순간이 없으므로 인터페이스가 변경되지 않습니다. 우리는 여전히 온도계가 .9에서 보입니다. 코드가 계속 실행되고 progress을 0으로 설정하면 코드가 종료됩니다. 이제 다시 그리기가 있습니다. 그래서 온도계 이제까지 1.

간단한 병렬 실험에 표시되지 않고 0-0.9에서 점프는 다음과 같이이다 : 당신은보기가 녹색으로하지 참조거야

myView.backgroundColor = [UIColor greenColor]; 
sleep(2); 
myView.backgroundColor = [UIColor redColor]; 

때 다시 그리기 순간 때문에 오는 마지막 명령은 그것을 붉게하는 것이 었습니다. 그래서 그것이 나타나는 것입니다.

기술적으로 런타임이 코드 실행을 시작하는 이벤트를 보내면 CATransaction이 시작됩니다. 모든 코드가 실행되고 런타임의 원래 이벤트가 완료되면 CATransaction이 "커밋 됨"이되고 정리 작업이 시작됩니다. 여기에는 모든 축적 된 도면을 수행하고 요청 된 애니메이션을 실행하는 작업이 포함됩니다.

+0

메인 스레드에서 절대로 절전 모드로 전환하지 마십시오. – rmaddy

+0

그래서 어떻게 해결할 수 있습니까? – BluGeni

+0

@BluGeni 성취하고자하는 것이 무엇인지 모르겠습니다! 귀하의 질문은 귀하의 코드가 원인이 된 행동의 원인을 이해하지 못했기 때문입니다. 나는 그것을 설명했다. – matt

관련 문제