一、前言
隨著iOS版本來到10,我們開發的應用種類也越來越豐富,范圍也不僅僅局限在app本身,Apple為我們提供了多項系統擴展服務,讓你的app與系統層級有更多交互。
我們今天要說的就是將你的app擴展到系統中Today的應用:TodayExtension。
廢話不多說,我們開始實現一個簡單的Widget功能。
二、實現Widget
創建好Target Today服務后,會在XCODE中生成一個目錄
同時配置文件中也會生成新的Target,設置好標題我們就可以開始寫代碼了。
當你新建了這個Target時,不會共享你原有項目的Target的組件或者第三方的插件,我剛開始也是在想玩什么我的AF居然not find。后來才反應過來是在另一個Target了,這里就好像你每創建一個項目附帶產生的Tests一樣。
那現在知道我們不能用之前項目中的內容了,我們新的功能如果要用第三方又的自己新加進來使用。
TodayViewController.m
我們發現它自動代理了NCWidgetProviding協議。
還導入了一個API:NotificationCenter,其中有很多Widget需要的API,就不一一列舉了,自己可以點進去看
我們看看它到底有哪些需要實現的:
下圖可以看到3個optional
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult result))completionHandler;
大致意思是建議你通過實現它的回調來獲取數據,你也可以在viewwillappear中設置你的初始數據,但是希望你在獲取到新數據時能平穩的過渡到新的數據來。并且它是在主線程更新。
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);
這個代理就是很多人問的Widget折疊和收起,實現了之后就會在Widget上有“折疊”和“收起”的功能。這里要根據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
天貓
什么值得買