在Quartz中绘制时显示UIActivityIndi​​cator

时间:2012-08-09 06:34:20

标签: iphone objective-c ipad uiview core-graphics

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

我尝试启动指标的动画,然后使用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 个答案:

答案 0 :(得分: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;
    });
});