因为我必须在UIview中画很多点,所以我想在UIview上显示一个活动指示器视图。
我试过这样的东西,但不起作用。
-(void) drawRect:(CGRect)rect
{
[self.activityIndicatorView startAnimating];
CGContextRef cr = UIGraphicsGetCurrentContext();
// Lots of CG functions (take a few seconds)
[self.activityIndicatorView startAnimating];
}
绘图时,我可以做些什么来显示纺车?
使用解决方案编辑(感谢@dasblinkenlight):
两个UIImageView,一个用作占位符(运行UIActivityIndicatorView的位置),另一个用于绘制CG内容,名为Renderer。
如本文所述,Renderer类编写一个UIImage。当drawrrect调用完成时,将其放置在另一个队列(背景)中,占位符可以使用要显示的图像。
这就是代码:
dispatch_queue_t myQueue=dispatch_queue _create("myQueue",0);
dispatch_async(myQueue, ^{ [self.renderer drawRect:self.placeholder.bounds]; dispatch_async(dispatch_get_main_queue(), ^{ [self.placeholder setImage:[self.renderer renderedImage]]; }); });
我仍然不明白为什么我必须直接调用drawRect函数,而不是setNeedDisplay。可能是因为它在后台运行?
您不能这样做:当您的drawRect
正在执行时,不可能对屏幕进行其他更新;旋转齿轮将没有机会被绘制或更新。
如果你的drawRect
需要几秒钟的时间,你应该重新考虑你的策略:也许你可以在一个绘制内存位图的函数中隔离绘图密集型代码,在drawRect
代码绘制的位置显示一个带有占位符图像的UIImageView
,在后台线程中进行渲染,并用你的代码绘制的图像替换UIImageView
的图像。