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 ...
随机推荐
- jemter 使用if控制器,选择需要的内容
背景:需要根据人员传入的变量,来选择运行的环境,调用不同的参数,进行拼接,使用到if控制器 取到的数据,调用的就是test1的数据
- Codeforces 962D - Merge Equals
链接: http://codeforces.com/problemset/problem/962/D 题意: 给出一个整数序列.选择其中最小且出现两次(或以上)的数,把最左边的两个从序列中移除,然后把 ...
- 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...
- select下拉框之默认选项清空
最近和小伙伴发现,select默认选项一般是提示信息,怎么才能让当我们点击下拉框时,可选的选项中没有默认的提示信息呢? 思路: 1.当点击下拉框时,让默认提示信息,即下拉框第一个选项移除. 2.当没有 ...
- linux nginx 配置php
linux nginx 配置php 下载php源码 解压 configure ./configure --prefix=/usr/local/php --enable-fpm --with-mcr ...
- PAT——1015. 德才论
宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人 ...
- Oracle 备份恢复实例
Oracle 备份恢复实例:三思笔记 1 shutdown abort 系统归档模式,有备份 create table xx as select * from emp; update xx set e ...
- vue+element-ui中的图片获取与上传
vue+element-ui中的图片获取与上传 工作上接触了一下图片的处理,图片的格式是文件流, 记录如下. 请求图片 请求图片的时候,带上{ responseType: 'blob' }, 否则图片 ...
- WebPack系列之Proxy
背景 当我们直接去访问https://m.weibo.cn/api/config/list时由于端口.域名的不同产生了跨域,无法请求到资源数据. 分析 WebPack中devServer的proxy代 ...
- #leetcode刷题之路7- 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321 示例 3:输入: 120输出: 21 #i ...