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开发,理解程度还是比较浅显的。