3D Touch學(xué)習(xí)之一: 如何配置3D Touch

支持設(shè)備

  • 軟件: iOS9+
  • 硬件: 6s, 6s Plus及以后版本

開發(fā)環(huán)境

Xcode7+

3D Touch可以做什么?

  • 點(diǎn)擊icon,打開APP提供的快捷操作
  • 在APP內(nèi)部,對(duì)下一級(jí)頁面進(jìn)行預(yù)覽

三種操作模式

  • Home Screen Quick Actions
  • Peek & Pop

Home Screen Quick Actions

過去,用戶可以通過點(diǎn)擊APP icon來啟動(dòng)APP,現(xiàn)在用戶可以通過按壓APP的icon,觸發(fā)3D Touch來獲得APP啟動(dòng)的快速入口.當(dāng)用戶選擇某項(xiàng)快捷操作后,APP會(huì)被激活或者啟動(dòng),APP內(nèi)部通過代理方法,來獲取用戶選擇的快捷入口的信息.

Home Screen Quick Actions

如圖,icon的3D Touch被觸發(fā)時(shí),會(huì)顯示APP的快捷入口,其他的背景會(huì)做模糊處理.這些快捷入口的設(shè)置方式如下.

設(shè)置首頁的快速點(diǎn)擊

設(shè)置首頁的快速點(diǎn)擊有兩種方法:

靜態(tài)設(shè)置: 在Info.pilst文件中設(shè)置

在Info.plist文件中,添加數(shù)組UIApplicationShortcutItems,數(shù)組元素為Dictionary,每個(gè)字典包含快速點(diǎn)擊的信息.在UIApplicationShortcutItems中最低可以設(shè)置4個(gè)Item,多余的部分不會(huì)被顯示.

對(duì)于每個(gè)shortItem而言,可以設(shè)置的參數(shù)如下:

  • UIApplicationShortcutItemType: 必填
    用來對(duì)點(diǎn)擊事件進(jìn)行分類,處理
  • UIApplicationShortcutItemTitle: 必填
    主標(biāo)題,在沒有副標(biāo)題時(shí)最多顯示兩行
  • UIApplicationShortcutItemSubtitle: 非必填
    副標(biāo)題,顯示在主標(biāo)題下方,只可顯示一行,當(dāng)有副標(biāo)題時(shí),主標(biāo)題最多顯示一行,副標(biāo)題字體大小小于主標(biāo)題
  • UIApplicationShortcutItemIconType: 非必填
    系統(tǒng)提供的圖片庫內(nèi)的圖片
  • UIApplicationShortcutItemIconFile: 非必填
    自定義圖片,填寫項(xiàng)為bundle內(nèi)的圖片名或asset內(nèi)的圖片名,圖片尺寸為 35x35p
  • UIApplicationShortcutItemUserInfo: 非必填
    內(nèi)容為字典,可以自己定義,用以在點(diǎn)擊時(shí)獲得更多信息
動(dòng)態(tài)設(shè)置: 通過代碼設(shè)置

通過類UIApplicationShortcutItem設(shè)置每個(gè)Item的屬性,屬性內(nèi)容同靜態(tài)設(shè)置一樣,最后通過UIApplication.sharedApplication().shortcutItems = [item1, item2, ...]設(shè)置

靜態(tài)設(shè)置 vs. 動(dòng)態(tài)設(shè)置
  • 動(dòng)態(tài)設(shè)置在APP運(yùn)行時(shí)生效
  • 靜態(tài)設(shè)置在APP安裝時(shí)生效

當(dāng)靜態(tài)設(shè)置的個(gè)數(shù)小于限制個(gè)數(shù)4個(gè)時(shí),動(dòng)態(tài)設(shè)置的item將會(huì)被添加,最后結(jié)果仍是最多顯示4個(gè).

Peek & Pop

在APP的UIViewController內(nèi)的view可以響應(yīng)3D Touch事件,操作可以被細(xì)分為三個(gè)步驟

1.驗(yàn)證是否可預(yù)覽
2.顯示預(yù)覽彈窗
3.進(jìn)入預(yù)覽頁面

驗(yàn)證預(yù)覽

UIViewController頁面,需要遵守協(xié)議UIViewControllerPreviewingDelegate,并且在想要觸發(fā)3D Touch的view上進(jìn)行注冊(cè)

       if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
            [self registerForPreviewingWithDelegate:self sourceView:view];
        }

執(zhí)行完此步驟,在輕壓制定view的時(shí)候,會(huì)在view四周進(jìn)行模糊處理,效果如圖.

Peek avaliable
顯示預(yù)覽彈窗

在預(yù)覽后,繼續(xù)深壓,則會(huì)顯示預(yù)覽界面.協(xié)議實(shí)現(xiàn)協(xié)議方法

#pragma mark - UIViewControllerPreviewingDelegate
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
    UIViewController *viewController = [UIViewController alloc] init];
    return  viewController;

}

方法內(nèi)部返回的Controller即為預(yù)覽界面,如圖

Peek

如果想在預(yù)覽界面,通過上滑進(jìn)行快捷操作,可以在被預(yù)覽界面,遵守協(xié)議UIViewControllerPreviewingDelegate,并實(shí)現(xiàn)快捷操作代理方法:

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {

    UIPreviewAction *collectItem = [UIPreviewAction actionWithTitle:collectonTitle style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];

    UIPreviewAction *shareItem = [UIPreviewAction actionWithTitle:@"分享" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
       
    }];

    return @[collectItem, shareItem];
}

如此配置,效果如下圖

Peek quick actions

用戶點(diǎn)擊了按鈕之后,預(yù)覽界面消失,執(zhí)行UIPreviewAction內(nèi)的操作,此次預(yù)覽結(jié)束.

進(jìn)入預(yù)覽界面

如果用戶在預(yù)覽窗口界面繼續(xù)深按,則會(huì)進(jìn)行預(yù)覽界面,實(shí)現(xiàn)方法,在提供view的界面,通過代理方法


- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    viewControllerToCommit.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:viewControllerToCommit animated:YES];
}

進(jìn)行push或者present操作.

總結(jié)

3D Touch的適配就到這了,看了這些相信你已經(jīng)可以在APP內(nèi)集成3D Touch了,還有一些細(xì)節(jié),比如在預(yù)覽界面出現(xiàn)和消失時(shí)的生命周期是如何的呢?我們下次就此進(jìn)行分析.

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

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

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