用drawRect设置UIView backgroundColor:

我想设置一个自定义的UIView类的背景颜色。 该类还在drawRect:方法中执行石英绘图。

由于背景颜色的改变不会发生,直到下一次重绘的视图,我调用setNeedsDisplay之前更改UIView的backgroundColor属性。 我已经设置了一个UIActivityIndicatorViewanimation,而视图正在重绘。

 self.backgroundColor = theColor; [indicator startAnimating]; [self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil]; 

指示器在setNeedsDisplay结束时停止。 每次我需要调用这个时, theColor都会改变。

假设我有一个耗时的setNeedsDisplay进程。 我想设置背景,并保持指标animation。 目前,改变backgroundColor调用setNeedsDisplay但不改变backgroundColor,直到performSelectorInBackground方法运行! 因此,我的应用程序挂起,没有任何指标是永远不会animation。 我如何处理这个订购问题? 谢谢。

编辑:我的意思是我的drawrect:可能是费时的。

假设我有一个耗时的setNeedsDisplay进程

不要吧。 你没有业务重写setNeedsDisplay 。 我完全不清楚你最终想做什么,但是这整个问题似乎是对如何画的一个误解。 当你调用setNeedsDisplay (正如你所知道的那样,你必须在主线程中做),就是这样。 你站在原地,当重绘时刻到来,你的视图的drawRect:被调用。 这是绘图。

如果问题只是活动指标永远不会发生,那是因为你从不给它一个机会。 它也不会开始,直到重绘的时刻。 但是,在重绘时刻到来之前,您正在停止活动指示器! 所以显然你永远不会看到它。

在接下来的事情之前,明确地启动活动指示器的方法是在下一个重绘时刻之后走出主线程。 这就是所谓的“延迟表演”。 例:

 self.backgroundColor = theColor; [indicator startAnimating]; double delayInSeconds = 0.1; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // do something further, eg call setNeedsDisplay }; 

您可以通过再次调用dispatch_after来扩展该示例,以在下一次重绘时刻之后停止该指标。

但是,我必须给你留下深刻的印象,如果单纯的绘画行为需要一个活动指标来覆盖它,那么你就错了。 你的绘画行为必须非常快。 您可能想观看关于这个话题的WWDC 2012video; 它提供了如何高效绘制的优秀技巧。

您只能在主线程上更新UI,而不能在后台中更新

尝试使用另一个带有活动指标的子视图,放在重绘之前,然后从超视图中移除