自從iPhone6s币厕、iPhone6sP出現(xiàn)后列另,推出了一個新功能,能讓你的手指“按到屏幕里面去”旦装,應公司需要页衙,特花幾個小時研究了一下,對于開發(fā)阴绢,并不算難店乐。記下筆錄。
注:我是真機做測試呻袭,模擬器沒測試眨八,暫不考慮。
一左电、給app桌面上icon圖表添加3DTouch廉侧。
1页响、靜態(tài)添加
很簡單,在info.plist文件中添加如下數(shù)組段誊。
想添加多個3D下的icon選項闰蚕,就添加item,但是最多只能添加4個(不要問我為什么最多四個连舍,蘋果說的)
1)UIApplicationShortcutItemIconType 快捷通道icon圖片的類型没陡,系統(tǒng)自帶很多常用類型。
當然我們也可以用自己工程中的圖片索赏。
設置UIApplicationShortcutItemIconFile對應的value為自己想到像是的圖片盼玄。
2)UIApplicationShortcutItemType? 設置快捷通道的類型,可以作為標示(必須)参滴。
3)UIApplicationShortcutItemTitle ?毫無疑問强岸,標題(必須)。
4)UIApplicationShortcutItemSubtitle ? ?不難看出砾赔,副標題蝌箍。
5)UIApplicationShortcutItemUserInfo ? 設置信息的字典,用于傳值暴心。
ok妓盲,靜態(tài)搞定,但是专普,我們的程序中有的時候在不同的情況下悯衬,希望顯示的快捷內容不同,這個時候檀夹,我們可以用動態(tài)的程序來設置筋粗。
2、動態(tài)設置炸渡,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代碼
1)首先我們實例化一個數(shù)組娜亿。
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這個參數(shù)也可以傳自己的工程里面的圖片?
例:[UIApplicationShortcutIcon iconWithTemplateImageName:@"icon"]
ok蚌堵,代碼動態(tài)創(chuàng)建搞定了买决,這個時候,我們需要寫一個系統(tǒng)回調方法吼畏,在用戶通過快捷通道進來的時候調用督赤。
二、添加回調方法
還是在Appdelegate類里面泻蚊,有一個系統(tǒng)的回調方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
假如用戶是通過快捷通道進來的躲舌,就會調用這個系統(tǒng)方法,我們可以根據(jù)不同的shortcutItem.type進行辨別是哪個選項進來的性雄,并做處理孽糖。
例:
if([shortcutItem.type isEqualToString:@"1"]){
//處理方法
}else{
}
注意:快捷通道按鈕的標題枯冈、副標題、圖片的位置我們是不能控制的办悟,系統(tǒng)會根據(jù)你的app的圖表在屏幕的什么地方有不用的顯示方式。
ok滩褥,講到這兒病蛉,我們大概會了在app的圖表上添加3DTouch技術響應,但是我們在app的里面瑰煎,有時候也需要這樣的需求铺然,接著往下看。
三酒甸、3DTouch有兩個不同的手勢魄健,peek和pop,通俗的說插勤,我們第一用力的響應為peek手勢沽瘦,在peek手勢的基礎上再次用里按時觸發(fā)pop手勢,當然农尖,這些手勢遵循一個協(xié)議UIViewControllerPreviewingDelegate析恋,遵守協(xié)議之后,我們再注冊peek和pop方法盛卡,最后實現(xiàn)回調方法助隧,不多說,上代碼滑沧。
1并村、// 注冊Peek和Pop方法
[self registerForPreviewingWithDelegate:self sourceView:self.view];
注:給哪個view注冊Peek和Pop方法,sourceView對應的就是那個View滓技。
2哩牍、/** peek手勢回調 ?*/
- (nullable UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location
其中參數(shù)previewingContext為當前響應3DTouch的高亮Rect區(qū)域。
location為當前點擊的Point
3殖属、/** pop手勢回調 ?*/
- (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit?
再次重按時調用此方法姐叁。
附:另外還有一個很嚴重的問題,就是當程序處于close狀態(tài)洗显,或者第一次是用3DTouch啟動時外潜,會發(fā)現(xiàn)沒有作用,只有當程序在后臺的時候用3DTouch啟動才有作用挠唆。這時候是因為处窥,當程序從關閉狀態(tài)啟動時,調用- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler的時候self.windows的rootViewCroller是nil玄组;我的解決方法是在這個方法里面也設置一遍rootViewCroller滔驾,就能解決了谒麦。
到此,3DTouch的基本使用就沒問題了哆致。第一次寫這類技術文檔绕德,有很多不足的地方,望各位看官批評指正摊阀。