Today Extension 视图在重绘时闪烁

Posted

技术标签:

【中文标题】Today Extension 视图在重绘时闪烁【英文标题】:Today Extension view flashes when redrawing 【发布时间】:2014-10-23 07:48:44 【问题描述】:

根据 Apple 文档,“为了帮助您的小部件保持最新状态,系统偶尔会捕获小部件视图的快照。当小部件再次可见时,会显示最近的快照,直到系统将其替换为实时版本视图。”

但是,我看到的是,在准备好实时取景之前,快照已从屏幕上移除。这会产生一种闪光效果,旧快照从屏幕中取出,视图在瞬间空白,然后出现新视图。

开发者是否负责在快照和实时取景之间进行无缝转换?如果是这样,这样做背后的策略是什么?我看不出有任何方法可以直接控制该转换。

我能够通过将数据加载移动到 widgetPerformUpdateWithCompletionHandler: 并在 viewWillAppear: 中保持绘图,但我仍然看到通知中心每 15 次(左右)打开一次闪烁。

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题,最后发现了我的小部件存在的问题。原来这与我对 Widget 生命周期的误解有关。

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

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

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

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

【讨论】:

嗯,你对“快照”的误解,似乎完全等同于我自己对快照的误解。感谢您的研究和投入。我会试一试,如果它解决了我的闪光灯问题,我会告诉你(我怀疑它会,鉴于你所描述的)。 @christopherdrum 这对你有用吗?如果是这样,记得将其标记为正确答案以帮助他人:) 还没有机会尝试这个。老实说,如今,Today Widget 几乎已成为我们项目的最低优先级。如果我下周有时间尝试一下,我会这样做,以便我可以标记一个正确的答案。 确认这一点可以解决闪烁问题。缓存数据并在viewDidLoad 中恢复它可以避免闪烁。我曾经在widgetPerformUpdateWithCompletionHandler 中恢复数据,并且经常出现这种闪烁。谢谢@bencallis! 另请注意,widgetPerformUpdateWithCompletionHandler 仅在 viewDidLoad 之后并根据 Apple 文档在“合适的时间”调用。这意味着如果您正在更新viewDidLoadwidgetPerformUpdateWithCompletionHandler 中的数据,并且如果用户第二次拉下通知中心并且您有数据要更新,那么它不一定会在小部件中更新。我使用viewWillAppear 更新数据。【参考方案2】:

你需要小心你的编译处理程序

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

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

【讨论】:

是的,我已经对这个问题进行了大量的日志记录和断点观察。如果我在 widgetPerformUpdateWithCompletionHandler: 的开头放置一个断点并稍等片刻,小部件内容就会完全消失。这是在任何数据加载或 UI 布局或任何东西之前。确实,每次视图出现时都会调用 widgetPerformUpdateWithCompletionHandler: ,但这似乎与 8.1 文档一致。尚不清楚哪些视图控制器方法以什么顺序以及在什么时间为小部件调用。它们的行为不像典型的视图控制器。 如果您没有错误,它们实际上会运行。我对您的代码一无所知,但存在导致它崩溃的错误,这就是您的视图消失的原因。请查看设备系统日志以查找问题。 好吧,我在崩溃日志中什么也没看到。但我会继续听取您的建议,看看是否还有其他我们尚未检测到的错误。

以上是关于Today Extension 视图在重绘时闪烁的主要内容,如果未能解决你的问题,请参考以下文章

TabView 在重绘时是不是会错过导航点击?

WinForm防止界面闪烁

在 MFC 中重绘时闪烁

自定义视图在缩放后重绘时如何防止“反弹”效果?

iOS:当视图中有两个小的不相邻区域需要重绘时,调用两次 setNeedsDisplayInRect 是不是更快?

UITableViewCell 子视图在重绘之前不显示