自從iPhone6s、iPhone6sP出現后,推出了一個新功能,能讓你的手指“按到屏幕里面去”,應公司需要,特花幾個小時研究了一下,對于開發,并不算難。記下筆錄。
注:我是真機做測試,模擬器沒測試,暫不考慮。
一、給app桌面上icon圖表添加3DTouch。
1、靜態添加
很簡單,在info.plist文件中添加如下數組。
想添加多個3D下的icon選項,就添加item,但是最多只能添加4個(不要問我為什么最多四個,蘋果說的)
1)UIApplicationShortcutItemIconType 快捷通道icon圖片的類型,系統自帶很多常用類型。
當然我們也可以用自己工程中的圖片。
設置UIApplicationShortcutItemIconFile對應的value為自己想到像是的圖片。
2)UIApplicationShortcutItemType? 設置快捷通道的類型,可以作為標示(必須)。
3)UIApplicationShortcutItemTitle ?毫無疑問,標題(必須)。
4)UIApplicationShortcutItemSubtitle ? ?不難看出,副標題。
5)UIApplicationShortcutItemUserInfo ? 設置信息的字典,用于傳值。
ok,靜態搞定,但是,我們的程序中有的時候在不同的情況下,希望顯示的快捷內容不同,這個時候,我們可以用動態的程序來設置。
2、動態設置,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代碼
1)首先我們實例化一個數組。
NSMutableArray *shortcutItems = [NSMutableArray array];
2)再實例化一個shortcutItem
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"1" localizedTitle:@"測試1"];
或者
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"1" localizedTitle:@"測試1" localizedSubtitle:@"sub1" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeFavorite] userInfo:nil];
當然,icon這個參數也可以傳自己的工程里面的圖片?
例:[UIApplicationShortcutIcon iconWithTemplateImageName:@"icon"]
ok,代碼動態創建搞定了,這個時候,我們需要寫一個系統回調方法,在用戶通過快捷通道進來的時候調用。
二、添加回調方法
還是在Appdelegate類里面,有一個系統的回調方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
假如用戶是通過快捷通道進來的,就會調用這個系統方法,我們可以根據不同的shortcutItem.type進行辨別是哪個選項進來的,并做處理。
例:
if([shortcutItem.type isEqualToString:@"1"]){
//處理方法
}else{
}
注意:快捷通道按鈕的標題、副標題、圖片的位置我們是不能控制的,系統會根據你的app的圖表在屏幕的什么地方有不用的顯示方式。
ok,講到這兒,我們大概會了在app的圖表上添加3DTouch技術響應,但是我們在app的里面,有時候也需要這樣的需求,接著往下看。
三、3DTouch有兩個不同的手勢,peek和pop,通俗的說,我們第一用力的響應為peek手勢,在peek手勢的基礎上再次用里按時觸發pop手勢,當然,這些手勢遵循一個協議UIViewControllerPreviewingDelegate,遵守協議之后,我們再注冊peek和pop方法,最后實現回調方法,不多說,上代碼。
1、// 注冊Peek和Pop方法
[self registerForPreviewingWithDelegate:self sourceView:self.view];
注:給哪個view注冊Peek和Pop方法,sourceView對應的就是那個View。
2、/** peek手勢回調 ?*/
- (nullable UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location
其中參數previewingContext為當前響應3DTouch的高亮Rect區域。
location為當前點擊的Point
3、/** pop手勢回調 ?*/
- (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit?
再次重按時調用此方法。
附:另外還有一個很嚴重的問題,就是當程序處于close狀態,或者第一次是用3DTouch啟動時,會發現沒有作用,只有當程序在后臺的時候用3DTouch啟動才有作用。這時候是因為,當程序從關閉狀態啟動時,調用- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler的時候self.windows的rootViewCroller是nil;我的解決方法是在這個方法里面也設置一遍rootViewCroller,就能解決了。
到此,3DTouch的基本使用就沒問題了。第一次寫這類技術文檔,有很多不足的地方,望各位看官批評指正。