检测 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
和标签本身上尝试过setNeedsDisplay
和setNeedsLayout
。 在标签的.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
iOS开发-UI 补充 UIWindow UIView UIlabel