我在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];
答案 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;
});
});