iOS 10 Today Widget解析
一、前言
前面一篇iOS開發(fā)之widget實(shí)現(xiàn)文章說(shuō)到了如何在iOS 8.0-9.3上實(shí)現(xiàn)widget,可是iOS 10已經(jīng)來(lái)襲,不了解一下iOS 10,把widget適配上去,說(shuō)不過(guò)去呀!所以,本篇文章就接著說(shuō)下iOS 10上面Today Widget的坑坑洼洼。
二、Today Widget新特性
安裝完iOS 10的beta版本,發(fā)現(xiàn)蘋果越發(fā)重視widget了:快速瀏覽,及時(shí)從喜愛的應(yīng)用中了解信息,如圖1所示。
現(xiàn)在,從鎖屏頁(yè)面,下拉通知欄的第一頁(yè),還有左滑主頁(yè)面都可以進(jìn)入widget。通過(guò)右上角的“展開”、“折疊”按鈕,可以查看widget的全部?jī)?nèi)容和部分內(nèi)容。在6s上面,點(diǎn)擊應(yīng)用icon的3D Touch界面中,也會(huì)有widget的折疊界面。
三、適配問題
1、在widget中,展開、折疊具體是怎么實(shí)現(xiàn)的呢?
在NSExtensionContext中,新添了widgetLargestAvailableDisplayMode屬性,來(lái)確認(rèn)當(dāng)前widget是展開還是折疊狀態(tài)。所以,先在viewWillAppear中設(shè)置widget的mode為展開。
代碼段1
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded; }
然后,就是展開和折疊的處理了。在NCWidgetProviding協(xié)議中,新添了這么個(gè)方法widgetActiveDisplayModeDidChange,不贅述,直接用代碼示例說(shuō)明它的用途:
代碼段2
// If implemented, called when the active display mode changes. // The widget may wish to change its preferredContentSize to better accommodate the new display mode. - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { if (activeDisplayMode == NCWidgetDisplayModeCompact) { self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110); } else { self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300); } }
到這里,你可以在iOS 10上面看到帶有展開、折疊功能的widget了,具體UI上面的微調(diào),這里暫且不表,聰明的你肯定早就知道解決方案了。但是,不要著急,容我再把自己遇到的坑給家接著叨叨。
2、啟動(dòng)app后,第一次顯示的是折疊,而不是展開呢?
這個(gè)問題,歸咎于preferredContentSize的設(shè)置,確認(rèn)widget的mode之前,不要設(shè)置這個(gè)值。我的處理方式是:在widgetActiveDisplayModeDidChange中設(shè)置展開或折疊狀態(tài)下widget的高度,就如上面的代碼段2一樣(當(dāng)然,我的項(xiàng)目里比這個(gè)處理要復(fù)雜的多,這里化繁為簡(jiǎn)只為示例),iOS 10環(huán)境下在這里設(shè)置高度也就足夠了。
3、為什么有時(shí)展開或折疊"失靈"了,沒有對(duì)應(yīng)的展開或折疊呢?
這個(gè)問題的前提,肯定是你展開、折疊對(duì)應(yīng)的widget高度不一樣,只是看到了右上角按鈕內(nèi)容改變,但高度卻沒有變。
這個(gè)問題的原因在于,點(diǎn)擊展開、折疊按鈕修改了widget的mode之后,卻沒有設(shè)置對(duì)應(yīng)的高度:preferredContentSize。怎么辦呢?再回到代碼段2,mode改變后,設(shè)置對(duì)應(yīng)狀態(tài)下的高度即可。
4、如何用XCode 7.3打出能夠適配iOS 10的widget呢?
適配完iOS 10,會(huì)發(fā)現(xiàn)代碼中總不能用XCode 8.0 beta打包代碼吧,可是用XCode 7.3打包代碼也編譯不過(guò)啊,widgetLargestAvailableDisplayMode和NCWidgetDisplayMode都是iOS 10的產(chǎn)物。
用kvc試試看?對(duì),就是kvc。閑言不表,直接看代碼吧:
代碼段3 相對(duì)于 代碼段1
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.extensionContext setValue:@"1" forKey:@"widgetLargestAvailableDisplayMode"]; }
代碼段4相對(duì)于代碼段2
- (void)widgetActiveDisplayModeDidChange:(NSInteger)activeDisplayMode withMaximumSize:(CGSize)maxSize { if (activeDisplayMode == 0) { self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110); } else { self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300); } }
5、切記:UI的更新要在主線程操作哈!?。”热玑u紫:
//通知主線程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //...........; });
好了,我在適配widget過(guò)程的問題就這些了,希望可以幫助正在開發(fā)widget遇到同樣問題的朋友。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Objective-C實(shí)現(xiàn)自定義的半透明導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Objective-C實(shí)現(xiàn)自定義的半透明導(dǎo)航的相關(guān)資料,需要的朋友可以參考下2016-05-05iOS各種ViewController控制器使用示例完整介紹
這篇文章主要為大家介紹了iOS各種ViewController控制器使用示例完整介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07iOS中l(wèi)ebel特殊字符的自動(dòng)換行問題解決
這篇文章主要給大家介紹了關(guān)于iOS中l(wèi)ebel特殊字符的實(shí)現(xiàn)不自動(dòng)換行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10iOS Moya實(shí)現(xiàn)OAuth請(qǐng)求的方法
這篇文章主要介紹了iOS Moya實(shí)現(xiàn)OAuth請(qǐng)求的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12iOS中UILabel text兩邊對(duì)齊的實(shí)現(xiàn)代碼
本文通過(guò)一段實(shí)例代碼給大家介紹了ios中uilabel text兩邊對(duì)齊的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Objective-C的MKNetworkKit開發(fā)框架解析
這篇文章主要介紹了Objective-C的MKNetworkKit開發(fā)框架解析,MKNetworkKit是一個(gè)用于iOS開發(fā)的輕量級(jí)框架,需要的朋友可以參考下2015-11-11