3D Touch初探
伴着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初探的更多相关文章
- iOS 3D Touch实践
本文主要讲解3DTouch各种场景下的开发方法,开发主屏幕应用icon上的快捷选项标签(Home Screen Quick Actions),静态设置 UIApplicationShortcutIte ...
- 初学3D Touch
引言 With iOS 9, new iPhone models add a third dimension to the user interface. A user can now press y ...
- iOS 3D Touch 适配开发
3D Touch的主要应用 文档给出的应用介绍主要有两块: 1.A user can now press your Home screen icon to immediately access fun ...
- 从3D Touch 看 原生快速开发
全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...
- 3D touch在Unity3D中的使用
0.开篇: 3D touch随着iOS9发布,它并不是一个单独的技术,而是可以分为pressure sensitivity.quick action以及peek&pop.在官方的介绍中提到可以 ...
- 3D Touch介绍:电子秤App与快捷操作
随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...
- iOS 3D touch 使用技巧
第一个 在桌面中3d Touch 打开菜单 由于本人纯属代码党,本次实现方法也只使用代码实现 到达到这个效果并不难,只需要在appdelegate中实现以下代码即可 ,当然也有缺点,就是这个app没运 ...
- 3D Touch
一.认识3D Touch 1.硬件和操作系统要求 iPhone 6s或者iPhone 6s Plus 操作系统要求 ios9+ 2.3D Touch的交互效果 QuickAct ...
- 3D touch的 使用心得
一.设置图标touch 快捷进入 1.静态标签 静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序会在动态标签的前面. 我们先来看静态标签的配置: 首先,在in ...
随机推荐
- Java虚拟机5:常用JVM命令参数
这里汇总一些平时用到的.看到的一些虚拟机参数: (1)-Xms20M 表示设置堆容量的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置堆容量的最大值为20M,必须以M为单位.将-Xmx和 ...
- LRU缓存算法与pylru
这篇写的略为纠结,算法原理.库都是现成的,我就调用了几个函数而已,这有啥好写的?不过想了想,还是可以介绍一下LRU算法的原理及简单的用法. LRU(Least Recently Used,最近最少 ...
- BZOJ4530:[BJOI2014]大融合(LCT)
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
- JS常用方法封装
迭代添加各种常用方法:项目中一定会有很多常用的方法,包括:取值,校验,等...... 获取 url 后的参数 function getQueryString(name) { var reg = new ...
- 让Git不再难学
写在前面 在团队做过软件开发的,版本控制必是不可或缺的一项.目前,版本控制主要分为集中式版本控制系统和分布式版本控制系统 ,即大家熟知的SVN和Git.Git是当下最流行的分布式版本控制系统,故,今天 ...
- Exhaustive Search
Write a program which reads a sequence A of n elements and an integer M, and outputs "yes" ...
- ASP.NET SingalR 点对点聊天实现思路总结
前一段时间写了一个简单的聊天室,是群聊的方式.博客地址:http://www.cnblogs.com/panzi/p/4980346.html.还有一种需求就是常见的尤其是培训机构的主页面,经常会有1 ...
- Server.xml解析
来源 本文整理自 <Tomcat内核设计剖析>.<Tomcat结构解析> 加上自己的理解.源码来自 Tomcat8.5 版本 <Server port="800 ...
- CSS3-阴影参数基础
box-shadow 语法:text-shadow: x-shadow y-shadow distance color; 值 描述 x-shadow 必需.水平阴影的位置.允许负值. y-sha ...
- 轻量ORM-SqlRepoEx (七)AspNetCore应用
ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...