iOS 10 适配 Widget

一、前言

随着iOS版本来到10,我们开发的应用种类也越来越丰富,范围也不仅仅局限在app本身,Apple为我们提供了多项系统扩展服务,让你的app与系统层级有更多交互。

File-New-Target


我们今天要说的就是将你的app扩展到系统中Today的应用:TodayExtension。

废话不多说,我们开始实现一个简单的Widget功能。


二、实现Widget

创建好Target Today服务后,会在XCODE中生成一个目录

同时配置文件中也会生成新的Target,设置好标题我们就可以开始写代码了。

当你新建了这个Target时,不会共享你原有项目的Target的组件或者第三方的插件,我刚开始也是在想玩什么我的AF居然not find。后来才反应过来是在另一个Target了,这里就好像你每创建一个项目附带产生的Tests一样。

那现在知道我们不能用之前项目中的内容了,我们新的功能如果要用第三方又的自己新加进来使用。

TodayViewController.m

TodayViewController.m

我们发现它自动代理了NCWidgetProviding协议。

还导入了一个API:NotificationCenter,其中有很多Widget需要的API,就不一一列举了,自己可以点进去看

我们看看它到底有哪些需要实现的:

下图可以看到3个optional

NCWidgetProviding协议

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

大致意思是建议你通过实现它的回调来获取数据,你也可以在viewwillappear中设置你的初始数据,但是希望你在获取到新数据时能平稳的过渡到新的数据来。并且它是在主线程更新。

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);

这个代理就是很多人问的Widget折叠和收起,实现了之后就会在Widget上有“折叠”和“收起”的功能。这里要根据NCWidgetDisplayMode枚举来判断当前是处于哪个状态。

NCWidgetDisplayMode

if (activeDisplayMode == NCWidgetDisplayModeCompact) {

     self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 100);

} else {

     self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 400);

}


宽度我这里用的是屏幕宽,高度自己设定。

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets;

这个方法主要是修改Widget的MarginInset的,默认Widget的内容视图是有一定边距的,如果想要去掉要实现这个代理方法。

介绍到这里相信你自己再开发功能就不用我来说了吧。

要注意的是Widget中不支持键盘弹出,也不建议ScrollView的滑动。苹果也建议上面的功能不要打断正常APP功能里的业务流程。

下面在分享几个我觉得做的好的Widget

天猫

什么值得买


推荐阅读更多精彩内容