一、前言
随着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枚举来判断当前是处于哪个状态。
NCWidgetDisplayModeif (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
天猫
什么值得买
网友评论