伴着6S的發佈,iOS 9.0開始支持3D Touch功能。使用場景來分一共有三種狀況。html
``` - (id <UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0); - (void)unregisterForPreviewingWithContext:(id <UIViewControllerPreviewing>)previewing NS_AVAILABLE_IOS(9_0); ```
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 { } ```
``` // 添加一些 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,暴露的組]; } ```
在 Info.plist 中 添加 `UIApplicationShortcutItems ` 字段,這個字段下面的每一個字典結構定義了一個 Item,key 以下: ``` `UIApplicationShortcutItemType (required)` 通常取值和 bundle id 一致,用來判斷快速操做類型。 `UIApplicationShortcutItemTitle (required)` 標題 `UIApplicationShortcutItemSubtitle` 副標題,顯示在標題下面 `UIApplicationShortcutItemIconType` 圖標 `UIApplicationShortcutItemIconFile` 自定義圖標文件,會覆蓋上面的icon type `UIApplicationShortcutItemUserInfo` 自定義信息 ``` 靜態添加的沒法修改,而且優先顯示。
也就是建立自定義的 `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]; ```
若是程序經過 action 啓動,那麼能夠在`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions` 函數的 `launchOptions`裏經過[UIApplicationLaunchOptionsShortcutItemKey] 取得item 信息。 若是程序在後臺,觸發了 action 事件,會調用`application:performActionForShortcutItem:completionHandler:`這個函數。
UITouch如今有了 force屬性,用於表示用戶按壓的力度,基於此能夠實現不一樣力度的一些不一樣處理。ios
基於 UIGestureRecognizer
以及 UITouch 的 force 屬性,能夠很容易寫出自定義的重按手勢。git
``` #import <UIKit/UIGestureRecognizerSubclass.h> ```
主要是根據 touch 的幾種狀態,來設置手勢的對應狀態,重按的檢測關鍵在於touch的力度大到是麼程度能夠認爲識別成功。github
重按若是和 tap 手勢一塊兒使用,如何讓兩個手勢同時都能識別出來呢,這就須要設置阻斷。個人 demo 中在手勢失敗以前,一直阻斷了 tap 手勢,不然 tap 會一直同時識別出來。最後與 tap 共存的狀態,同 longPress 和 tap 共存的狀態相似。xcode
在 6s 如下的機型中是不支持重按的,能夠基於機型和系統版原本判斷。還有一種狀況就是用戶在支持重按的機型上禁用了重按功能。設置-通用-輔助功能-3D Touch
,此時就要經過UITraitCollection 的 forceTouchCapability 來判斷。
監聽這個值的變化,UIScreen, UIWindow, UIViewController, UIPresentationController, 以及 UIView 都實現了 UITraitEnvironment
協議。該協議有以下方法監聽變化app
- (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/TP40009252iview