3D Touch初探

来源:http://www.cnblogs.com/v2m_/archive/2017/01/20/6329617.html
-Advertisement-
Play Games

伴著6S的發佈,iOS 9.0開始支持3D Touch功能。使用場景來分一共有三種情況。 一、基於UIViewController的擴展 1. 首先要註冊需要監聽重按手勢的 source view: 2. 重按手勢識別出來之後需要按照 協議去處理 peek 和 pop 事件,這個協議有兩個方法 3. ...


伴著6S的發佈,iOS 9.0開始支持3D Touch功能。使用場景來分一共有三種情況。

一、基於UIViewController的擴展

1. 首先要註冊需要監聽重按手勢的 source view:
```
- (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0);
- (void)unregisterForPreviewingWithContext:(id <UIViewControllerPreviewing>)previewing NS_AVAILABLE_IOS(9_0);
```
2. 重按手勢識別出來之後需要按照 UIViewControllerPreviewingDelegate協議去處理 peek 和 pop 事件,這個協議有兩個方法
```
// 對應 peek 事件,返回的是一個預覽界面。
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {


UIViewController* previewVC;
// 期望展示的大小
previewVC.preferredContentSize = CGSizeZero;
// 源rect,除了這個rect之外的區域都會模糊
previewingContext.sourceRect = CGRectZero;
return previewVC;
}
```

```
  // 對應 pop 事件,做一些對應處理
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    
}
```
3. 另外,對於 pop 出來的預覽界面,可以提供一些額外操作,這些操作需要添加在預覽VC裡面
```
// 添加一些 action
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
// action
UIPreviewAction *action = [UIPreviewAction actionWithTitle:@"--" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
    //do something
}];

// action group
UIPreviewActionGroup *previewGroup = 包含一組action;
return @[暴露的action,暴露的組];
}
```
4. XCode 7.1 之後的版本,如果支持 iOS 9.1 以上的系統,可以通過 XCode 直接把 segue 設置成 peek&pop 去實現這種效果。

二、APP 圖標重按

1. 靜態添加
在 Info.plist 中 添加 `UIApplicationShortcutItems ` 欄位,這個欄位下麵的每個字典結構定義了一個 Item,key 如下:

```
`UIApplicationShortcutItemType (required)`
一般取值和 bundle id 一致,用來判斷快速操作類型。
`UIApplicationShortcutItemTitle (required)`
標題
`UIApplicationShortcutItemSubtitle`
副標題,顯示在標題下麵
`UIApplicationShortcutItemIconType`
圖標
`UIApplicationShortcutItemIconFile`
自定義圖標文件,會覆蓋上面的icon type
`UIApplicationShortcutItemUserInfo`
自定義信息
```

靜態添加的無法修改,並且優先顯示。
2. 動態添加
也就是創建自定義的 `UIApplicationShortcutItem` 然後設置給 UIApplication。看代碼:

```
NSArray <UIApplicationShortcutItem *> *existingShortcutItems = [[UIApplication sharedApplication] shortcutItems];
UIApplicationShortcutItem *anExistingShortcutItem = [existingShortcutItems objectAtIndex: anIndex];
NSMutableArray <UIApplicationShortcutItem *> *updatedShortcutItems = [existingShortcutItems mutableCopy];
UIMutableApplicationShortcutItem *aMutableShortcutItem = [anExistingShortcutItem mutableCopy];
[aMutableShortcutItem setLocalizedTitle: @“New Title”];
[updatedShortcutItems replaceObjectAtIndex: anIndex withObject: aMutableShortcutItem];
[[UIApplication sharedApplication] setShortcutItems: updatedShortcutItems];
```
3. 獲取ShortcutItem信息
如果程式通過 action 啟動,那麼可以在`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions` 函數的    `launchOptions`里通過[UIApplicationLaunchOptionsShortcutItemKey] 取得item 信息。
如果程式在後臺,觸發了 action 事件,會調用`application:performActionForShortcutItem:completionHandler:`這個函數。

三、基於UITouch的 force 屬性

UITouch現在有了 force屬性,用於表示用戶按壓的力度,基於此可以實現不同力度的一些不同處理。

基於 UIGestureRecognizer 以及 UITouch 的 force 屬性,可以很容易寫出自定義的重按手勢。

1.引入頭文件
```
#import <UIKit/UIGestureRecognizerSubclass.h>
```
2.定義識別過程

主要是根據 touch 的幾種狀態,來設置手勢的對應狀態,重按的檢測關鍵在於touch的力度大到是麽程度可以認為識別成功。

3.其他手勢阻斷

重按如果和 tap 手勢一起使用,如何讓兩個手勢同時都能識別出來呢,這就需要設置阻斷。我的 demo 中在手勢失敗之前,一直阻斷了 tap 手勢,否則 tap 會一直同時識別出來。最後與 tap 共存的狀態,同 longPress 和 tap 共存的狀態類似。

四、支持判斷

在 6s 以下的機型中是不支持重按的,可以基於機型和系統版本來判斷。還有一種情況就是用戶在支持重按的機型上禁用了重按功能。設置-通用-輔助功能-3D Touch,此時就要通過UITraitCollection 的 forceTouchCapability 來判斷。
監聽這個值的變化,UIScreen, UIWindow, UIViewController, UIPresentationController, 以及 UIView 都實現了 UITraitEnvironment 協議。該協議有如下方法監聽變化

- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection

參考:
1.https://developer.apple.com/reference/uikit/uiapplicationshortcutitem
2.https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple\_ref/doc/uid/TP40009252



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 預載入圖片是提高用戶體驗的一個很好方法。圖片預先載入到瀏覽器中,訪問者便可順利地在你的網站上衝浪,並享受到極快的載入速度。這對圖片畫廊及圖片占據很大比例的網站來說十分有利,它保證了圖片快速、無縫地發佈,也可幫助用戶在瀏覽你網站內容時獲得更好的用戶體驗。本文將分享三個不同的預載入技術,來增強網站的性能 ...
  • 1.簡介 function命令與函數名之間有一個星號*; 函數體內部使用yield語句,定義遍歷器的每個成員,即不同的內部狀態。 總結: 調用Generator函數,返回一個部署了Iterator介面的遍歷器對象,用來操作內部指針。 以後,每次調用遍歷器對象的next方法,就會返回一個有著value ...
  • css快速佈局必弄清的幾件事:塊級元素&內聯元素概念釐清、盒模型、定位元素顯示優先順序總結、居中對齊方法總結、樣式繼承等。 ...
  • 我們在安裝環境的時候安裝了NDK,可以在eclipse下直接生成so文件。NDK的壓縮包裡面自帶了一些sample工程,NDK的文件直接解壓到某個目錄下即可。 第一次生成so文件的時候,我們先使用NDK的sample下的hello-jni的例子。 1、啟動eclipse,通過Create proje ...
  • 之前忘了把這些整理出來,現在補充一下,應該放在前面學習的 知識點: 1.UI的初步認識 2.UIWindow 3.UIView 4.UIlabel UI的初步認識 1.什麼是UI(*) UI即User Interface(用戶界面)的簡稱。UI設計則是指對軟 件的人機交互、操作邏輯、界面美觀的整體設 ...
  • 知識點: 1.UIView的簡單動畫 2.UIView層次關係 3.UIImageView的使用 4.UIView 停靠模式 UIView的簡單動畫 1.UIView坐標系統 1)UIView相對於父視圖的坐標系統 2.UIView的frame,center,bounds關係 frame: 該vie ...
  • 前幾天剛完工的一個定製單,需要用到分享,第三方登錄,微信支付功能。因為一直都是用友盟去集成分享和第三方登錄,所以項目初期就使用cocopads導入了友盟庫。 上個月開始做支付功能,支付寶支付沒有什麼問題,按照官方文檔順利實現。到微信支付時候,下載了微信包,導入項目,順利完成支付功能。然後開始做第三方 ...
  • 微軟新出UWP手機端調試利器App File Explorer簡介。通過瀏覽器就可以安裝卸載UWP應用,下載上傳手機端應用文件,查看應用運行記憶體等情況。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...