I have a complex Quartz routine in drawRect
for a custom UIView
subclass. It can take a few seconds to draw. What I'd like is to show a UIActivityIndicator
while it is drawing. But then the indicator must stop spinning (and get hidden) after the drawing is complete.
I tried to start the animation of the indicator and then use performSelector
for a custom method that simply calls setNeedsDisplay
- my thinking is that performSelector
will wait until the next run loop, right? In which case, my indicator has time to start on the main thread. This seems to be working, but as soon as I add the code to the end of drawRect
to stop the animation, the indicator doesn't show up at all, as if this animation is ending before it's had a chance to begin.
Any suggestions?
I call the drawing like this:
[self.spinner startAnimating];
[self performSelectorOnMainThread:@selector(redraw) withObject:nil waitUntilDone:YES];//tried both YES and NO here
-(void)redraw{
[self.customView setNeedsDisplay];
}
The drawRect:
simply has this at the end:
- (void)drawRect:(CGRect)rect{
//bunch of drawing
[self.nav stopSpinner]; // reference to a controller class
}
In self.nav
object is this:
-(void)stopSpinner{
self.spinner.hidden=YES;
[self.spinner stopAnimating];
}
And the spinner
object is initially created like this:
self.spinner=[[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease];
self.spinner.hidden=YES;
[self.viewController.view addSubview:self.spinner];