2012-08-09 86 views
1

对于自定义UIView子类,我在drawRect中有一个复杂的Quartz例程。可能需要几秒钟才能绘制。我想要的是在绘图时显示UIActivityIndicator。但是在绘图完成后,指标必须停止旋转(并隐藏)。在Quartz中绘图时显示UIActivityIndi​​cator

我试图启动指标的动画,然后使用performSelector作为简单调用setNeedsDisplay的自定义方法 - 我的想法是performSelector将等到下一个运行循环,对吧?在这种情况下,我的指标有时间在主线程上启动。这似乎正在工作,但只要我将代码添加到drawRect的末尾以停止动画,指示器根本不会显示,就好像该动画在它有机会开始之前就结束一样。

有什么建议吗?

我称这样的图:

[self.spinner startAnimating]; 
[self performSelectorOnMainThread:@selector(redraw) withObject:nil waitUntilDone:YES];//tried both YES and NO here 

-(void)redraw{ 
[self.customView setNeedsDisplay]; 

}

drawRect:简单地具有本底:

- (void)drawRect:(CGRect)rect{ 
    //bunch of drawing 
    [self.nav stopSpinner]; // reference to a controller class 
    } 

self.nav对象是这样的:

-(void)stopSpinner{ 
self.spinner.hidden=YES; 
[self.spinner stopAnimating]; 
} 

spinner对象最初创建这样的:

self.spinner=[[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease]; 
    self.spinner.hidden=YES; 
    [self.viewController.view addSubview:self.spinner]; 
+1

向我们展示了'的drawRect:'代码,试图阻止纺纱。 – 2012-08-09 06:42:57

+0

这很长,我宁愿不要在这里发布;然而函数的'}'前面最后一行是'UIActivityIndi​​cator'的消息,因为它会停止动画。 – johnbakers 2012-08-09 07:18:00

+0

编辑你的问题并粘贴在该行。 – 2012-08-09 07:31:46

回答

0

在后台线程上执行绘图。这不仅可以让你抛出一个活动指示器并根据需要制作动画,而且绘制本身的速度要快得多。在我的测试中,我已经看到在后台线程中复杂的Quartz绘图中速度提高了10倍。

这并不难。事实上,它可能非常快,你不需要活动指标。

下面的代码,你可以简单地使用常规UIImageView然后将其image属性分配给从其他线程渲染输出:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

    dispatch_async(queue, ^{ 

    UIGraphicsBeginImageContext(self.bounds.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //perform some drawing into this context 

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 


    dispatch_sync(dispatch_get_main_queue(), ^{ 
     self.imageView.image=viewImage; 
    }); 
}); 
相关问题