1.模擬器touch 效果git下載連接:https://github.com/DeskConnect/SBShortcutMenuSimulator
前一陣子伴隨著蘋果發布新產品iPhone6s 和 IOS9新系統,一系列關于硬件和軟件的新功能、新特性逐漸進入iPhone用戶的視線。這次我們就來講講傳聞已久的3D Touch。? ? ? ? 當然這個新功能不僅僅需要手機系統更新到最新的IOS9系統,更需要設備必須是iPhone6s及以上。哈哈哈。。。所以,這個功能目前也只能是iPhone6s的用戶才能體驗到??偟膩碚f蘋果推出3D Touch這個功能的目的和去年推出IOS8的時候推出擴展today的目的是一樣:增加APP的快捷入口,方便和簡化用戶進入APP相應功能的路徑,讓用戶更快的找到自己需要的應用功能。蘋果官方文檔對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手勢,按壓主屏幕上的應用Icon,可以直接進入應用的相應的功能模塊。(手機桌面上APP相應模塊的快捷入口)? ? ?
?2、用戶可以通過3D Touch手勢,按壓對應的視圖來預覽視圖的更多內容。(視圖信息的快速預覽)? ? ? 光靠上面的文字描述確實顯得很蒼白抽象。那么我們來看一下國內一些主流APP對于3D Touch功能的具體應用。? ? ?
?就拿QQ來說,關于第一條說明的應用場景如下圖的:? ? ? ?
?我們可以通過一定力度按壓桌面上QQ應用的圖標,就可以出現一個快捷操作的視圖??梢钥焖龠M入“掃一掃”或者“加好友”等其他模塊。? ? ? ??
關于第二條說明的應用場景如下圖的:??
? ? ? ? ? ? ? ? ? ? ? ??
在消息的列表頁面,用力按壓某一條對話消息,就可以預覽這條對話消息的具體內容。? ? ? ??
看完了具體的應用場景,我們一定很好奇這個3D Touch功能到底是怎么實現?其實3D Touch的實現一點也不復雜,相對于IOS8推出的today來說簡單很多,基本不需要太多的代碼操作。我們可以通過兩個方式來實現3D Touch。? ? ? ??
1、通過設置標簽:在項目的info.plist文件設置相應的標簽就基本上可以完成大體工作了!? ? ? ??
2、通過代碼的方式配置3D Touch。? ? ? ?
?那么我們先來看一下代碼方式是如何實現的:? ? ??
? IOS9為 UIApplication類新增了一個屬性shortcutItems來統一設置和管理應用的 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是一個數組類型的數據,數組里面的數據是 ?UIApplicationShortcutItem類的對象。
UIApplicationShortcutItem類也是IOS9為配置3D Touch而新增的類。也許我們已經猜到了,一個UIApplicationShortcutItem對象就是在桌面長按應用Icon彈窗視圖中的一個欄目。也就是上面“掃一掃”欄目的入口。同時UIApplication類還新增了一個代理方法來處理3D Touch對應的手勢操作。
[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;
具體的代碼實現:
[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副標題"?icon:icon1?userInfo:nil];
? ?//欄目2
? ? UIApplicationShortcutIcon?*icon2?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypePlay];
? ?UIApplicationShortcutItem?*item2?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item2"?localizedTitle:@"入口2"?localizedSubtitle:@"入口2副標題"?icon:icon2?userInfo:nil];
? //欄目3
? ? UIApplicationShortcutIcon?*icon3?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypePause];
? ? UIApplicationShortcutItem?*item3?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item3"?localizedTitle:@"入口3"?localizedSubtitle:@"入口3副標題"?icon:icon3?userInfo:nil];
? ?//欄目4
? ?UIApplicationShortcutIcon?*icon4?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypeAdd];
? ?UIApplicationShortcutItem?*item4?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"item4"?localizedTitle:@"入口4"?localizedSubtitle:@"入口4副標題"?icon:icon4?userInfo:nil];
? ? //設置?shortcutItems???需要注意的是shortcutItems數組最多只能加入四個item,超過四個只會顯示前面的四個
? ?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{
? ? ?//根據Item對應的type標識處理對應的點擊操作
? ?NSString?*itemType?=?shortcutItem.type;
? ?if([@"item1"?isEqualToString:itemType]){
? ? }
? ? else?if([@"item2"?isEqualToString:itemType]){
? ? }
? ?else?if?([@"item3"?isEqualToString:itemType]){
? ? }
? ?else?if?([@"item4"?isEqualToString:itemType]){
? ?}
? }
其中,UIApplicationShortcutIcon類就是設置每一個item項目的圖標,這個圖標可以是系統的圖標也可以是自定義的圖標。該類提供兩個初始化方法來供我們選擇:iconWithType:方法設置系統圖標 ,iconWithTemplateImageName:方法設置自定義圖標。具體的使用可以去查看該類的API。
UIApplicationShortcutItem類中的幾個屬性需要說明一下。Type屬性是用來標識每一個item項目的,通過這個標識我們可以區分點擊相應的每一項該觸發哪些操作(在3D Touch的代理方法中就是靠Type屬性來區分點擊的是哪一項)。localizedTitle屬性是每一個item的標題。localizedSubtitle屬性是每個item的副標題,這個副標題可有可無。icon屬性也就是上面說的每個item對應的圖標了。userInfo屬性是信息字典,用于傳值,這里設為空。
需要注意的是,根據本人的試驗:?UIApplication類的shortcutItems數組最多只能放四個item。也就是說通過3D Touch按壓桌面應用Icon彈出的操作視圖,該視圖里面最多只能有四個快捷入口選項。超過四個只能顯示最前面的四個。
到這里我們就通過代碼的方式實現了3D Touch功能了。
下面講一下通過設置標簽的形式實現3D Touch功能。我們只需要設置靜態標簽然后在UIApplication類中實現3D Touch的代理方法就可以了,靜態標簽是我們在項目的配置plist文件中配置的標簽,只要設置好對應的標簽和鍵值對就沒問題。
上面的代碼實現的應用效果如下圖:
上面的代碼實現的應用效果如下圖: