ios – 重新绘制时,“扩展”视图会闪烁

根据Apple文档,“为了帮助您的小部件看起来更新,系统会偶尔捕获您的小部件视图的快照.当小部件再次可见时,将显示最新的快照,直到系统使用视频的实时版本替换它“.

但是,我看到的是,在实时视图准备之前,快照已从屏幕上删除.这会导致闪存效果,其中旧快照被取消屏幕,视图为空白的分秒,然后出现新视图.

开发人员是否负责将快照和实时视图之间的转换无缝连接?如果是这样,那么背后的策略是什么呢?我没有任何方式直接控制这种转变.

我能够通过移动数据加载来大大减轻效果
widgetPerformUpdateWithCompletionHandler:并且在viewWillAppear中保留绘图,但是我每隔15(或更多)打开通知中心仍然看到一次闪光.

解决方法

我有这个同样的问题,最后弄清了我的小部件所带来的问题.事实证明,这与我对我的小部件生命周期的误解有关.

从文档中,我认为今天的视图会保持我的窗口小部件状态的“快照”,直到widgetPerformUpdateWithCompletionHandler方法完成处理程序成功调用为止.

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

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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...