检测 UIView/UILabel 何时重绘自身?

Posted

技术标签:

【中文标题】检测 UIView/UILabel 何时重绘自身?【英文标题】:Detect when UIView/UILabel redraws itself? 【发布时间】:2013-01-31 01:34:56 【问题描述】:

我有一个应用程序可以获取日历事件并向用户显示数据。尝试更新标签时出现一些奇怪的行为。

我可以很好地获取日历数据,但完成后,我的问题是,根据NSLog,我的label.text 属性已经更改,但在视图重绘之前还需要 4-8 秒。

因此,我试图检测标签何时重绘,而不是 .text 属性更改时,因此我可以在标签中填充数据的同时隐藏进度视图。

我已经在self.view 和标签本身上尝试过setNeedsDisplaysetNeedsLayout标签的.text 属性更改后 - 不起作用。

因此,除非我完全遗漏了有关使用 setNeedsDisplay 的某些内容(我知道它只会在下一次重绘时更新),否则我的问题是,我如何检测 UILabel 和/或 UIView 何时重绘自身?

我的应用是如何设置的:

我已经坚持了大约 3 周。

【问题讨论】:

刷新标签不应该花费 4-8 秒,除非您将主线程阻塞那么长时间,或者您可能没有在主线程上设置 .text 值。跨度> 进行获取的我的单身人士有一个调用 [mainViewController updateLabels]; 的委托,是在使用委托的主线程的“外部”吗? 【参考方案1】:

确保在主线程上调用setNeedsDisplay,使用performSelectorOnMainThread:withObject:waitUntilDone:,例如:

[view performSelectorOnMainThread:@selector(setNeedsDisplay) 
                       withObject:nil 
                    waitUntilDone:NO];

【讨论】:

你能澄清一下吗?在主线程上具体怎么调用? 我的单身人士打电话给[mainViewController updateLabels];。我为我的单身人士创建了一个新方法来调用:[mainViewController refreshLabels];,我在其中使用了[self performSelectorOnMainThread:@selector(updateLabels) withObject:nil waitUntilDone:NO];,它就像一个魅力。谢谢。 请注意,您根本不需要致电setNeedsDisplay。在这种情况下,只需确保更新主线程上的标签就足够了。【参考方案2】:

引用苹果开发文档:

直到下一个绘图周期才真正重绘视图,此时所有无效的视图都会更新。

也许你的主线程被其他东西阻塞了,比如处理许多复杂的计算

例如:

- (void)testMethod

    myLabel.mytext = @"aaaa";
    [myLabel setNeedsDisplay];
    // some complex calculations
    // the quickest ,  it will run finish the method then redraw.

【讨论】:

以上是关于检测 UIView/UILabel 何时重绘自身?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c:以编程方式设计 UIView/UILabel

当我禁用/启用按钮时,视图如何重绘自身?

Swing组件响应事件与自身重绘

iOS开发-UI 补充 UIWindow UIView UIlabel

回流(重排)与重绘 —— 什么是回流和重绘,造成的原因是什么,如何去减少?

回流(重排)与重绘 —— 什么是回流和重绘,造成的原因是什么,如何去减少?