我试图设置自定义UIView类的背景色。该类还在drawRect:方法中进行石英绘制。

由于背景颜色的更改直到下一次重新绘制视图时才发生,因此我在调用backgroundColor之前更改了UIView的setNeedsDisplay属性。我在视图重绘时设置了UIActivityIndicatorView进行动画处理。

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


指示器在setNeedsDisplay的结尾处停止。每当我需要调用theColor时,它都会改变。

假设我有一个耗时的setNeedsDisplay流程。我想设置背景并保持指示器动画。当前,更改backgroundColor会调用setNeedsDisplay,但直到performSelectorInBackground方法运行后才更改backgroundColor!因此,我的应用程序挂起,并且没有动画指示器。
如何处理此订购问题?谢谢。

编辑:我的意思是我的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, e.g. call setNeedsDisplay
};


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

但是,我必须给您留下深刻的印象,如果仅仅绘画动作花费的时间太长,以至于您需要一个活动指示器来覆盖它,那您就在画错了。您的绘画动作必须非常非常快。您可能想观看有关此主题的WWDC 2012视频;它提供了有关如何有效绘制的出色技巧。

关于ios - 使用drawRect设置UIView backgroundColor:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15047346/

10-10 20:35