今天重绘时,扩展视图会闪烁

时间:2014-10-23 07:48:44

标签: ios ios8-today-widget

根据Apple文档,“为了帮助您的窗口小部件查看最新版本,系统偶尔会捕获窗口小部件视图的快照。当窗口小部件再次可见时,将显示最新的快照,直到系统将其替换为实时版本的观点。“

然而,我所看到的是,在准备实时视图之前,快照将从屏幕上删除。这会导致闪光效果,其中旧快照从屏幕上取下,视图在一瞬间为空白,然后出现新视图。

开发人员是否负责在快照和实时视图之间进行无缝转换?如果是这样,那背后的策略是什么?我认为没有办法直接控制这种过渡。

通过将数据加载到,我能够大大减轻这种影响 widgetPerformUpdateWithCompletionHandler:并在viewWillAppear:中保持绘图,但我仍然会在通知中心每15(或左右)打开一次flash。

2 个答案:

答案 0 :(得分:26)

我遇到了同样的问题,最终弄明白我的小部件问题。事实证明,这与我代表对Widget生命周期的误解有关。

从文档中我认为今天的视图会保留一个'快照'我的小部件状态,直到成功调用widgetPerformUpdateWithCompletionHandler方法完成处理程序。

似乎并非如此。从我所看到的'快照'仅在今日视图动画时使用(当用户拉下通知中心时)。加载今天的视图并静止后,您的小部件将从头开始加载(如果使用则从xib中膨胀)并调用viewDidLoad。此时,您应该使用缓存数据(而不是Web请求)填充窗口小部件。如果你没有,你会看到笔尖的临时数据。这就是导致闪烁的原因。

viewDidLoad完成时,widgetPerformUpdateWithCompletionHandler被调用,允许您获取新数据。获取新数据时,您应该调用完成处理程序并缓存数据,以便稍后从头开始加载窗口小部件时可以使用它(在viewDidLoad中)。

缓存数据的一种简单方法是用户默认值。

答案 1 :(得分:2)

您需要注意

中的编译处理程序
  

- (void)widgetPerformUpdateWithCompletionHandler:(void(^)(NCUpdateResult))completionHandler

方法。发生的情况是您的扩展程序可能有错误,并且每次查看都会再次调用它。尝试将您的扩展附加到调试器(Debugger-> Attach to Process->您的扩展ID)并通过放置一些断点来查看结果。