用drawRect设置UIView backgroundColor:
我想设置一个自定义的UIView类的背景颜色。 该类还在drawRect:
方法中执行石英绘图。
由于背景颜色的改变不会发生,直到下一次重绘的视图,我调用setNeedsDisplay
之前更改UIView的backgroundColor
属性。 我已经设置了一个UIActivityIndicatorView
animation,而视图正在重绘。
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,而不能在后台中更新
尝试使用另一个带有活动指标的子视图,放在重绘之前,然后从超视图中移除