从iOS8开始,下拉的”今天”里,应用可以添加自己的小widget,就是下图这样的东西:
这个东西在Android里叫widget,不过在iOS中我们叫它Today Extension,因为它是iOS中众多种类的extensions中的一种。
Extensions有很多种,Today Extension之外,还有包括Share、Action、Photo Editing、Document Provider、Custom Keyboard、Watch App这些;其中一些很熟悉,像Watch App,另外一些可能不太熟悉;今天主要来研究Today Extension。
首先,如何创建一个Today Extension呢?很简单,在已有的项目里,在Xcode里,选择File-New-Target-Application Extension-Today Extension,新建一个target,如下图所示。
这样,一个Today Extension就建好啦。Run一下(就是那个new name,一个空的Today Extension):
是的,创建一个Today Extension就是这么简单。对于开发者来说,一个Today Extension其实就是一个有点儿特殊的UIViewController;我们可以向这个View Controller中添加subviews,执行任务,等等。不过在开发的过程中,还有一些常见的问题:
对于Today Extension来讲,主App的官方名称叫Containing App;widget并没有什么特殊的方式跟Containing App交互,只能跟其它App一样,调用URL Scheme来跳转到Containing App中,执行一些特定操作。
对于Today Extension来说,它的宽度是不能变的,就是屏幕的宽度;而它的高度可以根据内容动态变化。苹果推荐我们使用auto layout,这样Today Extension的高度就可以自适应变化;如果不用auto layout的话,还可以调用
self.preferredContentSize = CGSizeMake(0,100);
来将其高度定为100;
定时刷新很简单,用NSTimer就可以,只是要注意dealloc的时候,将NSTimer销毁;
对于下拉刷新,我们就要先搞清楚,下拉的时候,都调用了哪些方法。刚才讲了,Today Extension其实就是一个View Controller,因此它的生命周期,也是viewDidLoad-viewWillAppear-viewDidAppear-viewWillDisappear-viewDidDisappear-dealloc这个路子。也就是说,每次下拉展示Today Extension的时候,都会将这个流程走一遍,所以我们只要在viewDidLoad里调用最新结果就可以了。
苹果对Today Extension的建议:苹果认为,Today Extension就是一个执行简单操作、界面也简单的地方,不应当有复杂的界面、复杂的操作。因此最好不要在这里搞的很复杂,否则可能会在提交审核的时候被拒掉。
一些需要注意的地方:
Today Widget是不支持键盘输入的,所以诸如UITextField、UITextView之类的控件不应当放进来。
一般情况下,要避免使用UIScrollView,因为Today View本身就是一个scroll view,这样的话会让用户困惑,在操作的时候容易误操作。
Today Extension不是正常的App,因此有一些限制:
不能使用UIApplication这个类;
不能使用某些标记了NS_EXTENSION_UNAVAILABLE的API,以及一些诸如Health Kit、Event Kit的framework;
不能获取相机、麦克风;
不能长时间运行background tasks;
不能通过AirDrop得到数据,但可以向AirDrop发送数据;
以上就是关于Today Extension的普通问题,还有一些高端的情况,比如增加view时刷新高度、确定extension在特定情况下出现/特定情况下消失,等等情况,还有待进一步研究。
版权声明:本文为博主原创文章,未经博主允许不得转载。
iOS Today Extension/widget编程小记
原文地址:http://blog.csdn.net/lixing333/article/details/48142263