iOS 3D Touch(一) Home Screen Quick Actions

3d TouchiPhone 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,在介紹之前,先看一組別人的效果。

其他app.png

注意:

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

官網(wǎng)示例.png

上面的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ā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容