伴着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

3D Touch初探的更多相关文章

  1. iOS 3D Touch实践

    本文主要讲解3DTouch各种场景下的开发方法,开发主屏幕应用icon上的快捷选项标签(Home Screen Quick Actions),静态设置 UIApplicationShortcutIte ...

  2. 初学3D Touch

    引言 With iOS 9, new iPhone models add a third dimension to the user interface. A user can now press y ...

  3. iOS 3D Touch 适配开发

    3D Touch的主要应用 文档给出的应用介绍主要有两块: 1.A user can now press your Home screen icon to immediately access fun ...

  4. 从3D Touch 看 原生快速开发

    全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...

  5. 3D touch在Unity3D中的使用

    0.开篇: 3D touch随着iOS9发布,它并不是一个单独的技术,而是可以分为pressure sensitivity.quick action以及peek&pop.在官方的介绍中提到可以 ...

  6. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  7. iOS 3D touch 使用技巧

    第一个 在桌面中3d Touch 打开菜单 由于本人纯属代码党,本次实现方法也只使用代码实现 到达到这个效果并不难,只需要在appdelegate中实现以下代码即可 ,当然也有缺点,就是这个app没运 ...

  8. 3D Touch

    一.认识3D Touch   1.硬件和操作系统要求      iPhone 6s或者iPhone 6s Plus      操作系统要求 ios9+ 2.3D Touch的交互效果 QuickAct ...

  9. 3D touch的 使用心得

    一.设置图标touch 快捷进入 1.静态标签 静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序会在动态标签的前面. 我们先来看静态标签的配置: 首先,在in ...

随机推荐

  1. 如何理解“Unix 里一切都是文件”这句话-在 UNIX 中,一切都是字节流

    UNIX 操作系统的设计.用户界面.文化和演变都是建立在它的一套统一的想法和概念上.其中最重要的一点可能是“一切皆文件”,而这个概念被认为是 UNIX 的灵魂之一. 这一关键设计原则提供了一个统一的范 ...

  2. 高老大 ‘SQL Server 优化器特性导致的内存授予相关BUG’ 学习笔记

    今天高老大出了好文章.在这里 自己本来对这一块比较混乱,正好借这个机会学习一下. 就用高老大的脚本.需要的直接去他那里找吧,这里就省了. 加查询优化标记前后对比 可以看到GrantedMemory是5 ...

  3. 16、SpringBoot-CRUD错误处理机制(3)

    3).将自己指定的数据携带出去 出现错误以后,会来到/error请求,会被BasicErrorController 进行处理 响应出去的数据是由 getErrorAttributes 得到的( Abs ...

  4. LSOF 安装与使用(功能强大)

    Linux上安装: tar zxvf lsof_4.76.tar.gz cd lsof_4.76 ls 00.README.FIRST_4.76       lsof_4.76_src.tar.gz  ...

  5. 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)

    洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...

  6. STM32的备份寄存器和控制状态寄存器

    STM32的备份寄存器和控制状态寄存器 1 备份寄存器用于RTC时钟 RTC时钟可以在掉电以后继续计数,保证时间的延续,但是重新上电以后需要配置,保证之前的计数不会被清除,可以借助备份寄存器实现,备份 ...

  7. 微信小程序跳H5页面

    主页面:index.wxml 主页面:index.js ↑跳转到另一个wxml页面→recharge.wxml recharge.wxml web-view中设置跳转h5的链接,可以加上需要的参数: ...

  8. Oracle 体系结构二 内存结构

    Oracle实例由共享内存块(SGA)以及大量的后台进程构成. SGA必须包含的数据结构: 数据库缓冲区缓存 日志缓冲区 共享池 可选的数据结构: 大池 JAVA池 流池 其他缓冲区缓存池 用户会话还 ...

  9. #leetcode刷题之路12-整数转罗马数字

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 ...

  10. javascript 时间倒计时效果

    <div id="divdown1"></div> <script language="javascript" type=&quo ...