1.模擬器touch 效果git下載連接:https://github.com/DeskConnect/SBShortcutMenuSimulator
前一陣子伴隨著蘋果發(fā)布新產(chǎn)品iPhone6s 和 IOS9新系統(tǒng),一系列關(guān)于硬件和軟件的新功能、新特性逐漸進(jìn)入iPhone用戶的視線。這次我們就來講講傳聞已久的3D Touch。? ? ? ? 當(dāng)然這個(gè)新功能不僅僅需要手機(jī)系統(tǒng)更新到最新的IOS9系統(tǒng),更需要設(shè)備必須是iPhone6s及以上。哈哈哈。。。所以,這個(gè)功能目前也只能是iPhone6s的用戶才能體驗(yàn)到。總的來說蘋果推出3D Touch這個(gè)功能的目的和去年推出IOS8的時(shí)候推出擴(kuò)展today的目的是一樣:增加APP的快捷入口,方便和簡化用戶進(jìn)入APP相應(yīng)功能的路徑,讓用戶更快的找到自己需要的應(yīng)用功能。蘋果官方文檔對3D Touch的說明是這樣的:
[plain] view plain copy
1. With iOS 9, new iPhone models add a third dimension to the user interface.??
2.??
?3. 1、A user can now press your Home screen icon to immediately access functionality provided by your app.
? 4. 2、Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.? ? ? ?
?? 意思大概是這樣的:? ? ??
1、用戶可以通過3D Touch手勢,按壓主屏幕上的應(yīng)用Icon,可以直接進(jìn)入應(yīng)用的相應(yīng)的功能模塊。(手機(jī)桌面上APP相應(yīng)模塊的快捷入口)? ? ?
?2、用戶可以通過3D Touch手勢,按壓對應(yīng)的視圖來預(yù)覽視圖的更多內(nèi)容。(視圖信息的快速預(yù)覽)? ? ? 光靠上面的文字描述確實(shí)顯得很蒼白抽象。那么我們來看一下國內(nèi)一些主流APP對于3D Touch功能的具體應(yīng)用。? ? ?
?就拿QQ來說,關(guān)于第一條說明的應(yīng)用場景如下圖的:? ? ? ?

?我們可以通過一定力度按壓桌面上QQ應(yīng)用的圖標(biāo),就可以出現(xiàn)一個(gè)快捷操作的視圖。可以快速進(jìn)入“掃一掃”或者“加好友”等其他模塊。? ? ? ??
關(guān)于第二條說明的應(yīng)用場景如下圖的:??
? ? ? ? ? ? ? ? ? ? ? ??


在消息的列表頁面,用力按壓某一條對話消息,就可以預(yù)覽這條對話消息的具體內(nèi)容。? ? ? ??
看完了具體的應(yīng)用場景,我們一定很好奇這個(gè)3D Touch功能到底是怎么實(shí)現(xiàn)?其實(shí)3D Touch的實(shí)現(xiàn)一點(diǎn)也不復(fù)雜,相對于IOS8推出的today來說簡單很多,基本不需要太多的代碼操作。我們可以通過兩個(gè)方式來實(shí)現(xiàn)3D Touch。? ? ? ??
1、通過設(shè)置標(biāo)簽:在項(xiàng)目的info.plist文件設(shè)置相應(yīng)的標(biāo)簽就基本上可以完成大體工作了!? ? ? ??
2、通過代碼的方式配置3D Touch。? ? ? ?
?那么我們先來看一下代碼方式是如何實(shí)現(xiàn)的:? ? ??
? IOS9為 UIApplication類新增了一個(gè)屬性shortcutItems來統(tǒng)一設(shè)置和管理應(yīng)用的 3D Touch功能。
[objc] view plain copy
1. @class UIApplicationShortcutItem;??
2. @interface UIApplication (UIShortcutItems)??
3. // Register shortcuts to display on the home screen, or retrieve currently registered shortcuts.?
?4. @property (nullable, nonatomic, copy) NSArray*shortcutItems NS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;
5. @end
屬性?shortcutItems是一個(gè)數(shù)組類型的數(shù)據(jù),數(shù)組里面的數(shù)據(jù)是 ?UIApplicationShortcutItem類的對象。
UIApplicationShortcutItem類也是IOS9為配置3D Touch而新增的類。也許我們已經(jīng)猜到了,一個(gè)UIApplicationShortcutItem對象就是在桌面長按應(yīng)用Icon彈窗視圖中的一個(gè)欄目。也就是上面“掃一掃”欄目的入口。同時(shí)UIApplication類還新增了一個(gè)代理方法來處理3D Touch對應(yīng)的手勢操作。
[objc] view plain copy
1. //?Called?when?the?user?activates?your?application?by?selecting?a?shortcut?on?the?home?screen,
2. //?except?when?-application:willFinishLaunchingWithOptions:?or?-application:didFinishLaunchingWithOptions?returns?NO.
3. -?(void)application:(UIApplication?*)application?performActionForShortcutItem:(UIApplicationShortcutItem?*)shortcutItem?completionHandler:(void(^)(BOOL?succeeded))completionHandler?NS_AVAILABLE_IOS(9_0)?__TVOS_PROHIBITED;
具體的代碼實(shí)現(xiàn):
[objc] view plain copy
?-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
? ?//?Override?point?for?customization?after?application?launch.
? ?//欄目1
? ? UIApplicationShortcutIcon?*icon1?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypeCompose];
? ?UIApplicationShortcutItem?*item1?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item1"?localizedTitle:@"入口1"?localizedSubtitle:@"入口1副標(biāo)題"?icon:icon1?userInfo:nil];
? ?//欄目2
? ? UIApplicationShortcutIcon?*icon2?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypePlay];
? ?UIApplicationShortcutItem?*item2?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item2"?localizedTitle:@"入口2"?localizedSubtitle:@"入口2副標(biāo)題"?icon:icon2?userInfo:nil];
? //欄目3
? ? UIApplicationShortcutIcon?*icon3?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypePause];
? ? UIApplicationShortcutItem?*item3?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item3"?localizedTitle:@"入口3"?localizedSubtitle:@"入口3副標(biāo)題"?icon:icon3?userInfo:nil];
? ?//欄目4
? ?UIApplicationShortcutIcon?*icon4?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypeAdd];
? ?UIApplicationShortcutItem?*item4?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item4"?localizedTitle:@"入口4"?localizedSubtitle:@"入口4副標(biāo)題"?icon:icon4?userInfo:nil];
? ? //設(shè)置?shortcutItems???需要注意的是shortcutItems數(shù)組最多只能加入四個(gè)item,超過四個(gè)只會(huì)顯示前面的四個(gè)
? ?application.shortcutItems?=?@[item1,?item2,?item3,?item4];
? ? return?YES;
?}
[objc] view plain copy
?#pragma?mark?-??3D?Touch?代理方法
-(void)application:(UIApplication?*)application?performActionForShortcutItem:(UIApplicationShortcutItem?*)shortcutItem?completionHandler:(void?(^)(BOOL))completionHandler{
? ? ?//根據(jù)Item對應(yīng)的type標(biāo)識(shí)處理對應(yīng)的點(diǎn)擊操作
? ?NSString?*itemType?=?shortcutItem.type;
? ?if([@"item1"?isEqualToString:itemType]){
? ? }
? ? else?if([@"item2"?isEqualToString:itemType]){
? ? }
? ?else?if?([@"item3"?isEqualToString:itemType]){
? ? }
? ?else?if?([@"item4"?isEqualToString:itemType]){
? ?}
? }
其中,UIApplicationShortcutIcon類就是設(shè)置每一個(gè)item項(xiàng)目的圖標(biāo),這個(gè)圖標(biāo)可以是系統(tǒng)的圖標(biāo)也可以是自定義的圖標(biāo)。該類提供兩個(gè)初始化方法來供我們選擇:iconWithType:方法設(shè)置系統(tǒng)圖標(biāo) ,iconWithTemplateImageName:方法設(shè)置自定義圖標(biāo)。具體的使用可以去查看該類的API。
UIApplicationShortcutItem類中的幾個(gè)屬性需要說明一下。Type屬性是用來標(biāo)識(shí)每一個(gè)item項(xiàng)目的,通過這個(gè)標(biāo)識(shí)我們可以區(qū)分點(diǎn)擊相應(yīng)的每一項(xiàng)該觸發(fā)哪些操作(在3D Touch的代理方法中就是靠Type屬性來區(qū)分點(diǎn)擊的是哪一項(xiàng))。localizedTitle屬性是每一個(gè)item的標(biāo)題。localizedSubtitle屬性是每個(gè)item的副標(biāo)題,這個(gè)副標(biāo)題可有可無。icon屬性也就是上面說的每個(gè)item對應(yīng)的圖標(biāo)了。userInfo屬性是信息字典,用于傳值,這里設(shè)為空。
需要注意的是,根據(jù)本人的試驗(yàn):?UIApplication類的shortcutItems數(shù)組最多只能放四個(gè)item。也就是說通過3D Touch按壓桌面應(yīng)用Icon彈出的操作視圖,該視圖里面最多只能有四個(gè)快捷入口選項(xiàng)。超過四個(gè)只能顯示最前面的四個(gè)。
到這里我們就通過代碼的方式實(shí)現(xiàn)了3D Touch功能了。
下面講一下通過設(shè)置標(biāo)簽的形式實(shí)現(xiàn)3D Touch功能。我們只需要設(shè)置靜態(tài)標(biāo)簽然后在UIApplication類中實(shí)現(xiàn)3D Touch的代理方法就可以了,靜態(tài)標(biāo)簽是我們在項(xiàng)目的配置plist文件中配置的標(biāo)簽,只要設(shè)置好對應(yīng)的標(biāo)簽和鍵值對就沒問題。

上面的代碼實(shí)現(xiàn)的應(yīng)用效果如下圖:
上面的代碼實(shí)現(xiàn)的應(yīng)用效果如下圖:
