2013-02-24 2 views
0

사용자 정의 UIView 클래스의 배경색을 설정하려고합니다. 이 클래스는 또한 drawRect: 메서드에서 석영 드로잉을 수행합니다.drawRect로 UIView backgroundColor 설정 :

다음에보기를 다시 그리기 전까지 배경색이 변경되지 않으므로 setNeedsDisplay을 호출하기 전에 UIView의 backgroundColor 속성을 변경합니다. 뷰가 다시 그려지는 동안 UIActivityIndicatorView을 애니메이션으로 설정했습니다.

self.backgroundColor = theColor; 
[indicator startAnimating]; 
[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil]; 

setNeedsDisplay의 끝에서 표시기가 중지됩니다. theColor이 전화 할 때마다 변경됩니다.

시간이 많이 걸리는 setNeedsDisplay 프로세스가 있다고 가정 해 봅니다. 배경을 설정하고 지표 애니메이션을 유지하고 싶습니다. 현재 backgroundColor을 변경하면 setNeedsDisplay이 호출되지만 performSelectorInBackground 메서드가 실행될 때까지 backgroundColor가 변경되지 않습니다. 따라서 내 응용 프로그램이 응답하지 않고 표시기도 애니메이션입니다. 이 주문 문제는 어떻게 처리합니까? 감사.

편집 : 나는 drawrect:이 시간이 오래 걸릴 수 있음을 의미했습니다.

당신은없는 활동 표시와 다른 하위 뷰를 사용하는 backgroung에

시도에서, 단지 주 스레드에서 UI를 업데이트 할 수 있습니다

+1

'setNeedsDisplay'는 시간 소모적이지 않으며'drawRect :'입니다. 하지만 어쨌든'drawRect : '라고해서는 안됩니다. –

답변

0

는, 이제 내가 있다고 가정 해 봅시다 그리기 및

4

후 수퍼에서 제거 이전에 넣어 시간 소모적 인 setNeeds 디스플레이 프로세스

하자. setNeedsDisplay을 무시하는 비즈니스가 없습니다. 나는 당신이 궁극적으로 성취하려는 것을 분명히하지는 않지만,이 전체적인 질문은 어떻게 그릴 지에 대한 오해 인 것처럼 보인다. 당신이 setNeedsDisplay (당신이 말했던 것처럼, 당신은 메인 스레드에서해야합니다)이라고 부를 때, 그것은 그것입니다; 당신은 방해가되지 않으며, 다시 그리는 순간이 올 때, 당신의 시야는 drawRect:입니다. 그 그림입니다.

문제가 단순히 활동 표시기가 작동하지 않는다면 문제가 해결되지 않을 수 있기 때문입니다. 다시 그리는 순간까지는 시작하지 않을 것입니다. 그러나 다시 그리기 순간이 오기 전에 활동 표시기를 멈추고 있습니다! 그래서 분명히 당신은 그것을 보지 못할 것입니다.

다음에 작업 표시기를 시작하기 전에 작업 표시기를 시작하는 방법은 다음 다시 그리기 순간 인 이후 주 스레드 으로 나가는 것입니다. 이것은 "지연된 성능"이라고합니다. 예 :

self.backgroundColor = theColor; 
[indicator startAnimating]; 
double delayInSeconds = 0.1; 
dispatch_time_t popTime = 
    dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    // do something further, e.g. call setNeedsDisplay 
}; 

당신은 다음이 순간을 다시 그리기 후 표시를 중지하려면 다시 한번 dispatch_after를 호출하여 해당 예제를 확장 할 수있다.

단순한 그림 그리기가 너무 길어서 그것을 감싸는 활동 표시기가 필요하다면 잘못된 생각을하게됩니다. 당신의 그림 그리기는 아주 빨라야합니다. 이 주제에 관해 WWDC 2012 비디오를보고 싶을 수도 있습니다. 효율적으로 그리는 방법에 대한 훌륭한 팁을 제공합니다.

+0

혼란에 빠져서 죄송합니다. 즉, 내 drawrect : 방법을 잠시 걸릴 수 있음을 의미합니다. 드로잉의 복잡성은 사용자 입력을 기반으로하므로 최악의 상황에 대비하고 있습니다. Dispatch는 에서도 기억되지 않는 것으로부터 지원되지 않습니다. performselector를 사용하지 않아야합니까? 배경 설정을 통합하지 않으면 표시기가 제대로 작동합니다. – AnsonL

+0

@AnsonL 당신의 drawrect : 방법이 오래 걸린다면, 그것을 배제 할 필요가 있습니다. 매트가 말했듯이이 주제에 대한 훌륭한 WWDC2012 비디오가 있습니다 (이 경우에는 멀티 스레딩에 관한 것이지 그림이 아닙니다). 당신이해야 할 일은 별도의 스레드 (실제보기 대신 UIImage에서 작업)에 드로잉 작업을 넣은 다음 UI를 업데이트하기 위해 메인 스레드로 데이터를 포팅 한 후에 완료하는 것입니다. – RonLugge

+0

@AnsonL 내가 말한 것을 다시 읽으십시오 : 나 자신을 반복하지 마십시오. 당신의'drawRect :'는 잠깐 걸리지 않아야합니다. _fast_를 그려야합니다. 연기 된 실적을 내기 위해 파견 할 필요가 없습니다. 지연된 성능이나 스레딩을 이해하지 못하는 경우 내 책을 읽으 실 수 있습니다. http://www.apeth.com/iOSBook/ch38.html, http://www.apeth.com/iOSBook/ch11.html #_ 지연된 성능. 무엇보다도 WWDC 비디오보기. 특히 WWDC 2012 세션 235와 238을 생각하고 있습니다. – matt

관련 문제