执行UIView的drawrect函数时的UIActivityIndicatorView



因为我必须在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的图像。

最新更新