3d Touch是iPhone 6s+,iOS9+之后新增的功能。其最大的好處在于不啟動app的情況下,快速進(jìn)入app中的指定界面,說白了,就是一個(gè)快捷入口。
3D touch主要常見的使用:
- 1:Home Screen Quick Actions (主屏快捷行為入口)
- 2:peek and pop (預(yù)覽和彈出)
- 3:Force Properties (按壓力度)
- 4: Web view peek and pop API (HTML鏈接預(yù)覽功能)
本文主要介紹Home Screen Quick Actions,在介紹之前,先看一組別人的效果。

注意:
1.上線的
app默認(rèn)會有一個(gè)分享Action Item,也就是圖中最后一個(gè)Action Item。
2.最多可以添加4個(gè)Action Item,加上上線后的分享Action Item,最多能顯示5個(gè)Action Item。
3.彈出的3D Touch標(biāo)簽位置是由系統(tǒng)決定的,這里發(fā)現(xiàn)一個(gè)有趣的事,Action Item彈出位置靠屏幕下邊或者屏幕上邊,其順序也是相反的。
有兩種方法可以實(shí)現(xiàn)Home Screen Quick Actions,一種是使用.plist文件靜態(tài)聲明,另一種是使用 UIApplicationShortcutItem 對象構(gòu)造。 靜態(tài)構(gòu)造的quick actions可以在你的app第一次安裝時(shí)候就有效果,而動態(tài)構(gòu)造方法必須在第一次運(yùn)行之后才能有效果。不難發(fā)現(xiàn),現(xiàn)在大多數(shù)app都是動態(tài)構(gòu)造方法實(shí)現(xiàn)的,什么,不信,你可以去試試!
1.plist文件靜態(tài)聲明實(shí)現(xiàn)Home Screen Quick Actions

上面的
app展示圖中有5個(gè)Action Item,其中每個(gè)Action是使用UIApplicationShortcutItem這個(gè)對象進(jìn)行描述的,下面列出每一個(gè)UIApplicationShortcutItem中能夠包含的信息:
| 名稱 | 說明 | 是否必須 |
|---|---|---|
| UIApplicationShortcutItemType | 事件的唯一標(biāo)識,可以通過這個(gè)標(biāo)識來辨別你具體點(diǎn)擊了哪個(gè)事件 | 是 |
| UIApplicationShortcutItemTitle | 標(biāo)題,在沒有子標(biāo)題的情況下如果標(biāo)題太長能自動換行 | 是 |
| UIApplicationShortcutItemSubtitle | 子標(biāo)題,在標(biāo)題的下方 | 否 |
| UIApplicationShortcutItemIconType | 枚舉選取系統(tǒng)中的一個(gè)圖標(biāo)類型 | 否 |
| UIApplicationShortcutItemIconFile | 自定義一個(gè)圖標(biāo),以單一顏色35x35的大小展示,如果設(shè)置這個(gè),UIApplicationShortcutItemIconType將不起作用,圖片必須預(yù)先添加進(jìn)項(xiàng)目,而不能使用網(wǎng)絡(luò)路徑 | 否 |
| UIApplicationShortcutItemUserInfo | 字典,里面可以添加各種key,value對 | 否 |
UIApplicationShortcutItemIconType 這個(gè)key可以使用一些系統(tǒng)自定義的icon, 可選的類型的枚舉如下,詳細(xì)介紹和每個(gè)圖片的樣子可以參考這里。
2.以動態(tài)方式創(chuàng)建
檢測是否支持3D Touch
在iOS9中提供如下的接口用于檢查設(shè)備是否支持3D Touch:
@property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability NS_AVAILABLE_IOS(9_0); // unspecified: UIForceTouchCapabilityUnknown
其中UIForceTouchCapability是一個(gè)枚舉類型,具體的描述情況如下:
typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
UIForceTouchCapabilityUnknown = 0,//3D Touch檢測失敗
UIForceTouchCapabilityUnavailable = 1, //3D Touch不可用
UIForceTouchCapabilityAvailable = 2 //3D Touch可用
};
注意
由于兼容iOS 8.0,所以需要對3D Touch的檢測,并且不能通過機(jī)型來判斷3D Touch的可用與否,因?yàn)橛脩艨赡軙谠O(shè)置中把此功能關(guān)閉。
代碼部分
這里分兩種情況:
1.程序在被殺死的情況下,點(diǎn)擊圖標(biāo)進(jìn)入程序,會進(jìn)入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
2.程序在后臺,點(diǎn)擊圖標(biāo)進(jìn)入程序,會進(jìn)入
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;
首先在AppDelegate遵守協(xié)議(判斷3d touch 是否可用)
@interface AppDelegate ()<UITraitEnvironment>
實(shí)現(xiàn)代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (@available(iOS 9.0, *)) {
// 檢測3d touch 是否可用
if (self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
//手動創(chuàng)建3D Touch選項(xiàng)
//系統(tǒng)風(fēng)格的icon
// UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
// UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
// UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
// UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
//自定義圖標(biāo)
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"14Eleven"];
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"11Eleven"];
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"OVEleven"];
UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"PregnancyEleven"];
//創(chuàng)建選項(xiàng)
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.14Eleven" localizedTitle:@"尿14項(xiàng)檢測" localizedSubtitle:nil icon:icon1 userInfo:nil];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.11Eleven" localizedTitle:@"尿11項(xiàng)檢測" localizedSubtitle:nil icon:icon2 userInfo:nil];
UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.OVEleven" localizedTitle:@"排卵檢測" localizedSubtitle:nil icon:icon3 userInfo:nil];
UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.pregnancyEleven" localizedTitle:@"早孕檢測" localizedSubtitle:nil icon:icon4 userInfo:nil];
//添加到選項(xiàng)數(shù)組
[UIApplication sharedApplication].shortcutItems = @[item4,item3,item2,item1];
UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
if (shortcutItem) {
//判斷先前我們設(shè)置的快捷選項(xiàng)標(biāo)簽唯一標(biāo)識,根據(jù)不同標(biāo)識執(zhí)行不同操作
if([shortcutItem.type isEqualToString:@"com.niaodaifu.14Eleven"]){ // 14
[self detectionRoutineUrine_14Eleven];
} else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.11Eleven"]) { // 11
[self detectionRoutineUrine_11Eleven];
} else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.OVEleven"]) { // 排卵
[self detectionRoutineUrine_OVEleven];
} else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.pregnancyEleven"]) { // 早孕
[self detectionRoutineUrine_pregnancyEleven];
}
return NO;
}
}
}
return YES;
}
程序在后臺,點(diǎn)擊圖標(biāo)會進(jìn)去這個(gè)代理方法:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
//判斷先前我們設(shè)置的快捷選項(xiàng)標(biāo)簽唯一標(biāo)識,根據(jù)不同標(biāo)識執(zhí)行不同操作
if([shortcutItem.type isEqualToString:@"com.niaodaifu.14Eleven"]){
[self detectionRoutineUrine_14Eleven];
} else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.11Eleven"]) {
[self detectionRoutineUrine_11Eleven];
} else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.OVEleven"]) {
[self detectionRoutineUrine_OVEleven];
} else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.pregnancyEleven"]) {
[self detectionRoutineUrine_pregnancyEleven];
}
if (completionHandler) {
completionHandler(YES);
}
}
對于如何進(jìn)入主程序中任意一個(gè)界面,分兩種情況:
1.根界面
- (void)detectionRoutineUrine_11Eleven {
UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController;
tabBarVC.selectedIndex = 2;
}
2.其他非根界面,如二級、三級界面.....
-(void)detectionRoutineUrine_11Eleven {
UINavigationController *nav = ((UITabBarController*)self.window.rootViewController).selectedViewController;
CameraViewController *VC = [[CameraViewController alloc] init];
[nav pushViewController:VC animated:YES];
}
最后來一張效果圖吧
參考
在iOS9中使用3D Touch
iOS 3D touch開發(fā)(一) Home Screen Quick Actions
iOS 3D Touch 開發(fā)
iOS 3D Touch開發(fā)