用drawRect设置UIView backgroundColor:

问题描述:

我想设置一个自定义UIView类的背景颜色。该课程还采用drawRect:方法进行石英拉伸。用drawRect设置UIView backgroundColor:

由于在下一次重绘视图之前不会发生背景颜色变化,所以在调用setNeedsDisplay之前,我更改了UIView的backgroundColor属性。我在视图重绘时设置了一个UIActivityIndicatorView动画。

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

该指标在setNeedsDisplay的末尾处停止。每当我需要调用这个时,theColor都会改变。

比方说我有一个耗时setNeedsDisplay的过程。我想设置背景并保持指标动画。目前,更改backgroundColor调用setNeedsDisplay,但直到performSelectorInBackground方法运行才更改backgroundColor!因此,我的应用程序挂起,并没有任何指标是动画。 我该如何处理这个订购问题?谢谢。

编辑:我的意思是说我的drawrect:可能很耗时。

+1

'setNeedsDisplay'不耗时,它是'drawRect:'。但不管怎样,你都不应该调用'drawRect:'。 – 2013-02-24 01:00:39

只能在主线程更新UI,而不是在backgroung

尝试使用与活动的指标另一个子视图,摆在面前重绘后

从上海华删除比方说,我有一个耗时setNeedsDisplay process

让我们不要。您没有业务覆盖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视频;它提供了关于如何有效绘制的优秀技巧。

+0

对不起,我的意思是我的drawrect方法可能需要一段时间。绘图的复杂性取决于用户的输入,因此我正在努力做好最糟糕的准备。从我记忆中来看, AnsonL 2013-02-24 04:27:14

+0

@AnsonL如果你的drawrect:方法需要一段时间,那么你需要将它分解出来。正如马特所说,这个主题上有一个很棒的WWDC2012视频(尽管在这种情况下,它是关于多线程的,而不是绘图)。你需要做的是将绘图工作放在单独的线程上(在UIImage上工作而不是实际的视图?),然后一旦完成将数据移植到主线程以更新UI。 – RonLugge 2013-02-24 04:36:49

+0

@AnsonL重读我说的话:不要让我重复自己。你的'drawRect:'不应该花一点时间。你必须画_fast_。你不需要派遣来做延迟的表演;如果您不了解延迟的性能或线程,请阅读我的书:http://www.apeth.com/iOSBook/ch38.html,http://www.apeth.com/iOSBook/ch11.html #_delayed_performance。首先观看那些WWDC视频;我特别想到WWDC 2012会议235和238. – matt 2013-02-24 15:59:04