今天工作任務(wù)不太緊,研究了一下3D Touch沮榜,主要總結(jié)了下Home screen quick action 和peep、pop兩塊。接下來(lái)讓我一一道來(lái)。老規(guī)矩雅任,參考的文章會(huì)在下面列出來(lái)。
Home screen quick action(主屏幕快速選項(xiàng))
關(guān)于主屏幕快速選項(xiàng)按鈕咨跌,有兩個(gè)設(shè)置方法椿访,分別為靜態(tài)添加和動(dòng)態(tài)代碼添加。現(xiàn)在先分別列舉出各自的實(shí)現(xiàn)方法虑润,然后在具體介紹各個(gè)參數(shù)的含義。
靜態(tài)添加:(info.plist)
實(shí)現(xiàn)效果:
其實(shí)上面每一條列表加酵,對(duì)應(yīng)的就是一個(gè)UIApplicationShortcutItem,接下來(lái)看一下這個(gè)類具體的參數(shù)含義:
接下來(lái)是動(dòng)態(tài)添加:
iOS 9之后Application添加了一個(gè)屬性
@property(nullable,nonatomic,copy)NSArray *shortcutItemsNS_AVAILABLE_IOS(9_0)__TVOS_PROHIBITED;
這個(gè)屬性就是用來(lái)動(dòng)態(tài)添加主屏幕快速選項(xiàng)的拳喻,具體的添加代碼為:
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
UIApplicationShortcutIcon*icon1 = [UIApplicationShortcutIconiconWithType:UIApplicationShortcutIconTypePlay];
UIMutableApplicationShortcutItem*item1 = [[UIMutableApplicationShortcutItemalloc]initWithType:@"666"localizedTitle:@"paly"localizedSubtitle:@"打開(kāi)"icon:icon1userInfo:nil];
UIApplicationShortcutIcon*icon2 = [UIApplicationShortcutIconiconWithType:UIApplicationShortcutIconTypeShare];
UIMutableApplicationShortcutItem*item2 = [[UIMutableApplicationShortcutItemalloc]initWithType:@"777"localizedTitle:@"share"localizedSubtitle:@"分享"icon:icon2userInfo:nil];
[UIApplicationsharedApplication].shortcutItems=@[item1,item2];
returnYES;
}
到目前為止,相當(dāng)于創(chuàng)建了UIButton并添加到了相應(yīng)地View上面猪腕,剩下的就是添加點(diǎn)擊回調(diào)了冗澈。
-(void)application:(UIApplication*)applicationperformActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void(^)(BOOLsucceeded))completionHandler NS_AVAILABLE_IOS(9_0);
通過(guò)點(diǎn)擊,系統(tǒng)回調(diào)如上的方法陋葡,返回相應(yīng)地shortcutItem亚亲。接下來(lái)就可以根據(jù)相應(yīng)地屬性值來(lái)做區(qū)分進(jìn)行相應(yīng)地操作了,如下是打斷點(diǎn)獲取到的參數(shù)詳情腐缤。
到這里基本的主屏幕快速選項(xiàng)操作個(gè)人認(rèn)為就差不多了捌归,接下來(lái)就是幾個(gè)需要注意的小坑:
1)最多只會(huì)顯示4個(gè)Item,也就是說(shuō)無(wú)論你往數(shù)組里面放多少個(gè)岭粤,都只會(huì)顯示四個(gè)
2)當(dāng)靜態(tài)惜索,動(dòng)態(tài)兩種方法同時(shí)存在的時(shí)候,會(huì)先讀取靜態(tài)添加的Item剃浇,然后才會(huì)進(jìn)行動(dòng)態(tài)添加巾兆。
Peek && pop(預(yù)覽與跳轉(zhuǎn))
首先借用一下網(wǎng)友對(duì)該功能的理解。
現(xiàn)在你可以授權(quán)應(yīng)用的視圖控制器來(lái)響應(yīng)用戶不同的按壓力量虎囚。隨著用戶按壓力量的增加角塑,交互會(huì)出現(xiàn)三個(gè)階段:
1. 暗示內(nèi)容預(yù)覽是可使用的
2. 展示預(yù)覽(peek),和快捷選項(xiàng)菜單(peek quick actions)
3. 可選的跳轉(zhuǎn)到預(yù)覽中的視圖(pop)
當(dāng)你使用 peek 和 pop 時(shí),系統(tǒng)通過(guò)壓力決定從哪個(gè)階段過(guò)度至下一個(gè)
在App內(nèi)使用該功能之前淘讥,最好先檢測(cè)一下設(shè)備是否支持3D Touch功能圃伶,iOS9中添加了UIForceTouchCapability這一屬性,可在ViewWillAppear中調(diào)用下面方法進(jìn)行判斷,如果設(shè)備不支持的話留攒,火蜥可以替換成長(zhǎng)按等其他響應(yīng)手勢(shì)煤惩。
if(self.traitCollection.forceTouchCapability==UIForceTouchCapabilityAvailable)
另外還可以對(duì)手勢(shì)改變進(jìn)行監(jiān)聽(tīng),如果用戶在使用過(guò)程中修改了3D Touch設(shè)置炼邀,則會(huì)觸發(fā)方法回調(diào)
-(void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection
確定了3D Touch功能可用之后魄揉,就可以對(duì)視圖進(jìn)行注冊(cè)。
- (id)registerForPreviewingWithDelegate:(id)delegate sourceView:(UIView*)sourceView ?NS_AVAILABLE_IOS(9_0);
在這之后拭宁,只要該視圖響應(yīng)了Touch手勢(shì)洛退,就會(huì)觸發(fā)下面的方法回調(diào),只要在這個(gè)方法里返回想要進(jìn)行預(yù)覽展示的UIViewController就可以了杰标。
- (UIViewController*)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location
如果在預(yù)覽頁(yè)面向上滑動(dòng)的話兵怯,則會(huì)彈出UIPreviewAction,具體的實(shí)現(xiàn)應(yīng)該在所預(yù)覽的ViewController中實(shí)現(xiàn)腔剂,-(NSArray>*)previewActionItems媒区,唯一需要注意的是數(shù)組中可添加UIPreviewAction 和 UIPreviewActionGroup兩種類型的參數(shù)。
最后掸犬,如果在peek的基礎(chǔ)上繼續(xù)用力按壓的話袜漩,則會(huì)觸發(fā)pop效果,具體的調(diào)用方法是
-(void)previewingContext:(id)previewingContext commitViewController:(UIViewController*)viewControllerToCommit
經(jīng)過(guò)測(cè)試測(cè)試發(fā)現(xiàn)湾碎,在該回調(diào)方法中宙攻,你可以直接對(duì)這個(gè)該返回VC進(jìn)行操作,也可以另外創(chuàng)建VC進(jìn)行彈出操作介褥,具體彈出調(diào)用的方法為:
[self showViewController:viewControllerToCommit sender:self];
到這里應(yīng)該基本的功能實(shí)現(xiàn)就差不多了座掘,其實(shí)感覺(jué)下面參考文章中總結(jié)的更好些,之所以從新總結(jié)一遍是想強(qiáng)迫自己把代碼從頭敲一遍柔滔。如果發(fā)現(xiàn)上面理解錯(cuò)誤的地方請(qǐng)指出溢陪,我們一起探討。
參考文章:
淺談3D Touch(1) -- Home screen quick action