【问题标题】:Show UIActivityIndicator while drawing in Quartz在 Quartz 中绘图时显示 UIActivityIndi​​cator
【发布时间】:2012-08-09 06:34:20
【问题描述】:

我在 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];

【问题讨论】:

  • 向我们展示试图停止旋转的drawRect: 代码。
  • 篇幅比较长,这里就不贴了;然而,函数} 之前的最后一行是发送给UIActivityIndicator 的消息,以使其停止动画。
  • 编辑您的问题并粘贴到该行。
  • 我发现了问题并将在几秒钟内更新我的问题。微调器没有停止的问题是我忘记为self.nav 传递对正确对象的引用但现在指示器根本没有显示,可能是因为绘图仍在与指示器启动时相同的运行循环事件上发生动画

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


【解决方案1】:

在后台线程上执行绘图。这不仅可以让您抛出一个活动指示器并让它根据需要进行动画处理,而且绘图本身的速度要快得多。在我的测试中,我发现在后台线程上复杂的 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;
    });
});

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多