初探3D Touch

3D Touch介绍

从iPhone 6s开始,产品都添加了一项硬件属性,叫做3D touch。作为屏幕的一部分,新的传感器将能识别用力按下屏幕的动作并检测到精确的压力变化。这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同的用户交互。

**文档给出的应用介绍主要有两块:**

_1. A user can now press your Home screen icon to immediately access functionality provided by your app._

_2. Within your app, a user can now press views to see previews of additional content and gain accelerated access to features._

第一部分的应用是我们可以通过3D手势,在主屏幕上的应用Icon处,直接进入应用的响应功能模块。

第二部分是对app的一个优化,用户可以通过3D Touch手势在view上来预览一些预加载信息,这样的设计可以使app更加简洁大方,交互性也更强。

**iOS 9提供了如下3D Touch API:**

· Home Screen quick action API,使你可以给应用图标添加快速选项,从而让应用预料和加速其与APP的交互。

· UIKit peek and pop API,可让你在应用中为用户提供快速访问更多内容的功能,而无需离开当前上下文环境。使用peek quick actions的API提供的按压功能来替换你应用的触摸长按操作。(通过配置视图控制器来提供peek和pop。)

· Web view peek and pop API,让你使用系统提供的HTML链接预览功能。

(在web视图中,你可以对超链接和侦测到的数据使用全新的 allowsLinkPreview 属性来开启peek和pop。Peek和Pop会通过Safari Services FrameWrok中的SFSafariViewController类自动侦测链接和数据)

· UITouch force properties,让应用增加自定义的基于压力的用户交互。

(在iOS 9中,UITouch类获得了两个全新的属性帮助你在应用中自定义3D Touch: force 和maximumPossibleForce。这些属性可以让你侦测并响应APP接收的对象中的触摸压力。在iPhone上,触控压力感应有很大的动态范围,对于你的应用来说它是个浮点值。)

不管你使用以上哪些APIs,你的应用必须在运行时检测3D Touch的可用性。由于用户在应用运行时可以关闭3D Touch,所以在你实现的代理方法中把读取这个属性的值作为其一部分。

在模拟器上学习和测试3D Touch

3D Touch是一个很新颖的设计,可是苹果文档有言:

_With Xcode 7.0 you must develop on a device that supports 3D Touch. Simulator in Xcode 7.0 does not support 3D Touch._

看到这句话心是不是凉了一半,是的,Xcode7是支持3D Touch开发的,可是模拟器并不支持这个手势,我们只能在真机上进行学习与测试,但是在IT的世界,从来都不缺拯救世界的人物,github上有人为我们提供了这样的一个插件,可以让我们在模拟器上进行3D Touch的效果测试:

git地址:https://github.com/DeskConnect/SBShortcutMenuSimulator

在终端中一次运行如下指令:

git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git

cd SBShortcutMenuSimulator

make

之后在SBShortcutMenuSimulator的目录中执行如下操作:

xcrun simctl spawn booted launchctl debug system/com.apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD/SBShortcutMenuSimulator.dylib

xcrun simctl spawn booted launchctl stop com.apple.SpringBoard

如果没有报错,我们可以通过向指定端口发送消息的方法来在模拟器上模拟3D Touch的效果了

echo 'com.apple.mobilecal' | nc 127.0.0.1 8000

其中,com.apple.mobilecal是应用的Bundle ID ,如果要测试我们的应用,将其改为我们应用的BundleID即可,下面的示例应用是系统日历。

Home Screen Quick Action使用与相关API详解

iOS9为我们提供了两种Qucik Action,分别是静态和动态的。

· 静态快速选项(Static quick actions)当用户安装完应用后立即就能使用。在应用的 Info.plist 文件中的 UIApplicationShortcutItems 数组中定义 静态快速选项。

· 动态快速选项(Dynamic quick actions)在用户第一次加载应用后可用(同程)。使用 UIApplicationShortcutItem、UIMutableApplicationShortcutItem 以及 UIApplicationShortcutIcon 类和相关的API来定义 动态快速选项 。使用 shortcutItems 属性来添加动态快速选项到应用共享的 UIApplication 对象中。

在iOS 9中,一个应用最多能展示四个主屏快速选项。在这个限制下,系统首先展示静态快速选项,以plist菜单中的第一个为首。如果你的静态选项不够四个,并且你也定义了动态快速选项,那么会展示一个或多个动态快速选项。

两种快速选项都可以显示最多两行文本和一个可选的图标。系统会格式化文本,排列包装它,并且适当的添加省略号。

静态选项

静态选项是我们在项目的配置plist文件中配置的,在用户安装程序后就可以使用,并且排序会在动态选项的前面。

我们先来看静态选项的配置:

1. 首先,在info.plist文件中添加键值

2. 先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:

3. 必填项:

UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串

UIApplicationShortcutItemTitle 这个键值设置标签的标题

4. 选填项:

UIApplicationShortcutItemSubtitle 设置标签的副标题

UIApplicationShortcutItemIconType 设置标签Icon类型

UIApplicationShortcutItemIconFile  设置标签的Icon文件

UIApplicationShortcutItemUserInfo 设置信息字典

动态选项

动态选项是我们在程序中,通过代码添加的。

与动态选项相关的类,主要有三个:

1. UIApplicationShortcutItem 创建3D Touch标签的类

2. UIMutableApplicationShortcutItem 创建可变的3D Touch标签的类

3. UIApplicationShortcutIcon 创建标签中图片Icon的类

其中详细的属性和方法,我们在代码中进行简要讲解。

``` objc

UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];

//或者创建自定义图标的icon

UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"分享.png"];

//创建快捷选项

UIApplicationShortcutItem * item = [[UIApplicationShortcutItem alloc]initWithType:@"xxx" localizedTitle:@"分享" localizedSubtitle:@"分享副标题" icon:icon userInfo:nil];

//添加到快捷选项数组

[UIApplication sharedApplication].shortcutItems = @[item];

```

响应Quick Actions的行为

当我们点击标签进入应用程序时,可以进行一些操作,我们可以看到,在applocation中增加了这样一个方法:

` - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0);`

当我们通过标签进入app时,就会在appdelegate中调用这样一个回调,我们可以获取shortcutItem的信息进行相关逻辑操作。

这里有一点需要注意:我们在app的入口函数也需要进行一下判断,在launchOptions中有UIApplicationLaunchOptionsShortcutItemKey这样一个键,通过它,我们可以区别是否是从标签进入的app,如果是则处理结束逻辑后,返回NO,防止处理逻辑被反复回调。

` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;`

Quick Actions小注意点

1. 在iOS 9中,一个应用最多能展示四个主屏快速选项。在这个限制下,系统首先展示静态快速选项,以plist菜单中的第一个为首。如果你的静态选项不够四个,并且你也定义了动态快速选项,那么会展示一个或多个动态快速选项。两种快速选项都可以显示最多两行文本和一个可选的图标。系统会格式化文本,排列包装它,并且适当的添加省略号。

2. 图标和文字的位置会随着App在屏幕的位置变化而变化

3. 要考虑到关闭3D Touch和6s以下机型的情况,针对Quick Action所跳转的入口要提供2套或以上的方案。

4. 动态Quick Actions需要运行过一次才能出现

5. 对自定义的图片有一定的要求

6. 轻点,别按坏了

结论

3D touch是2015年版本的“右键点击”。它添加了另一种深度,带来了不同的交互意向。对于peek and pop来说,你可能还没有决定跳转到某个内容上去,但你肯定会对它感兴趣。只要有这种想法,预览内容的功能可以让你对眼前内容快速一瞥,而不跳转页面,这样可以快速返回到之前浏览的内容中。

这大约是iPhone 6s出之后没多久写的,那时候刚接触iOS开发,理解程度还是比较浅显的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容