一、前言
隨著iOS版本來到10拦坠,我們開發(fā)的應(yīng)用種類也越來越豐富连躏,范圍也不僅僅局限在app本身,Apple為我們提供了多項(xiàng)系統(tǒng)擴(kuò)展服務(wù)贞滨,讓你的app與系統(tǒng)層級有更多交互入热。
我們今天要說的就是將你的app擴(kuò)展到系統(tǒng)中Today的應(yīng)用:TodayExtension。
廢話不多說晓铆,我們開始實(shí)現(xiàn)一個(gè)簡單的Widget功能勺良。
二、實(shí)現(xiàn)Widget
創(chuàng)建好Target Today服務(wù)后骄噪,會(huì)在XCODE中生成一個(gè)目錄
同時(shí)配置文件中也會(huì)生成新的Target,設(shè)置好標(biāo)題我們就可以開始寫代碼了郑气。
當(dāng)你新建了這個(gè)Target時(shí),不會(huì)共享你原有項(xiàng)目的Target的組件或者第三方的插件腰池,我剛開始也是在想玩什么我的AF居然not find尾组。后來才反應(yīng)過來是在另一個(gè)Target了,這里就好像你每創(chuàng)建一個(gè)項(xiàng)目附帶產(chǎn)生的Tests一樣示弓。
那現(xiàn)在知道我們不能用之前項(xiàng)目中的內(nèi)容了讳侨,我們新的功能如果要用第三方又的自己新加進(jìn)來使用。
TodayViewController.m
我們發(fā)現(xiàn)它自動(dòng)代理了NCWidgetProviding協(xié)議奏属。
還導(dǎo)入了一個(gè)API:NotificationCenter跨跨,其中有很多Widget需要的API,就不一一列舉了囱皿,自己可以點(diǎn)進(jìn)去看
我們看看它到底有哪些需要實(shí)現(xiàn)的:
下圖可以看到3個(gè)optional
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult result))completionHandler;
大致意思是建議你通過實(shí)現(xiàn)它的回調(diào)來獲取數(shù)據(jù)勇婴,你也可以在viewwillappear中設(shè)置你的初始數(shù)據(jù),但是希望你在獲取到新數(shù)據(jù)時(shí)能平穩(wěn)的過渡到新的數(shù)據(jù)來嘱腥。并且它是在主線程更新耕渴。
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);
這個(gè)代理就是很多人問的Widget折疊和收起,實(shí)現(xiàn)了之后就會(huì)在Widget上有“折疊”和“收起”的功能齿兔。這里要根據(jù)NCWidgetDisplayMode枚舉來判斷當(dāng)前是處于哪個(gè)狀態(tài)橱脸。
if (activeDisplayMode == NCWidgetDisplayModeCompact) {
? ? ?self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 100);
} else {
? ? ?self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 400);
}
寬度我這里用的是屏幕寬,高度自己設(shè)定分苇。
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets;
這個(gè)方法主要是修改Widget的MarginInset的添诉,默認(rèn)Widget的內(nèi)容視圖是有一定邊距的,如果想要去掉要實(shí)現(xiàn)這個(gè)代理方法医寿。
介紹到這里相信你自己再開發(fā)功能就不用我來說了吧栏赴。
要注意的是Widget中不支持鍵盤彈出,也不建議ScrollView的滑動(dòng)靖秩。蘋果也建議上面的功能不要打斷正常APP功能里的業(yè)務(wù)流程须眷。
下面在分享幾個(gè)我覺得做的好的Widget
天貓
什么值得買