今天工作任務(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)代碼添加?,F(xiàn)在先分別列舉出各自的實(shí)現(xiàn)方法,然后在具體介紹各個(gè)參數(shù)的含義。
靜態(tài)添加:(info.plist)

實(shí)現(xiàn)效果:

其實(shí)上面每一條列表,對(duì)應(yīng)的就是一個(gè)UIApplicationShortcutItem,接下來(lái)看一下這個(gè)類(lèi)具體的參數(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)用戶(hù)不同的按壓力量。隨著用戶(hù)按壓力量的增加,交互會(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è)備不支持的話(huà),火蜥可以替換成長(zhǎng)按等其他響應(yīng)手勢(shì)。
if(self.traitCollection.forceTouchCapability==UIForceTouchCapabilityAvailable)
另外還可以對(duì)手勢(shì)改變進(jìn)行監(jiān)聽(tīng),如果用戶(hù)在使用過(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à),則會(huì)彈出UIPreviewAction,具體的實(shí)現(xiàn)應(yīng)該在所預(yù)覽的ViewController中實(shí)現(xiàn),-(NSArray>*)previewActionItems,唯一需要注意的是數(shù)組中可添加UIPreviewAction 和 UIPreviewActionGroup兩種類(lèi)型的參數(shù)。
最后,如果在peek的基礎(chǔ)上繼續(xù)用力按壓的話(huà),則會(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