程序员人生 网站导航

3D Touch

栏目:综合技术时间:2016-07-28 09:01:36

3D Touch开发初体验

3D Touch功能的开发难度其实不大,但是由于该功能需要有硬件支持,并且在摹拟器上没法体验,所以阻挡了1大批开发者的探索脚步。不过在计算机界历来没有能难倒程序员的问题,本文首先将介绍如何使用3D Touch的Home Screen Quick Actions功能,然后介绍如何在摹拟器中使用3D Touch。

3D Touch开发

3D Touch功能概览

3D Touch有2大模块:

1、Home Screen Quick Actions

通过主屏幕的利用Icon,我们可以用3D Touch呼出1个菜单,进行快速定位利用功能模块相干功能的开发,。如微信、京东的App,本文也将重点介绍这项开发技术。 


微信的快速入口

京东的快速入口

2、Force Properties

iOS9为我们提供了1个新的交互参数:力度。我们可以检测某1交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。

Home Screen Quick Actions开发指南

3D Touch快速入口标签有两种添加方式:1种是静态添加,在工程中的info.plist文件中添加相干项目。通过这类方式添加的标签,在app第1次运行前,就能够唤出这些标签;另外一种是动态添加,通过代码给App添加快速入口。这类方式添加的标签,第1次运行App前是看不到这些标签的,必须先运行1次App,以后就能够唤出这些标签了。

静态添加入口标签

静态添加入口标签不需要写代码,只需要在info.plist文件中添加相干功能设置便可。不过由于没有语句提示,所以我们只能1个字母1个字母的去添加,这1点不是很友好。

我们需要在info.plist中添加以下信息:


info.plist中添加的内容

分析1下添加的项目分别代表甚么意思。

首先是UIApplicationShortcutItems,他是1个数组类型,数组中的每个元素表示1个入口标签。

然后是Item0,这是数组中的1个元素,字典类型。在这个字典中配置各个标签的相干属性。

字段名 功能 是不是必须 备注
UIApplicationShortcutItemType 这个键值设置1个快捷通道类型的字符串 必有项 我们可以监听该项的值来判断用户是从哪个标签进入App的,该字段的值可以为空。
UIApplicationShortcutItemTitle 这个键值设置标签的标题 必有项 我们可以监听该项的值来判断用户是从哪个标签进入App的
UIApplicationShortcutItemSubtitle 设置标签的副标题 可选项  
UIApplicationShortcutItemIconType 设置标签的图标样式,系统提供了29中样式的图标,但大部份只能在9.1的系统上使用,只有少数可以在9.0的系统中使用,这1部份会在后边详细介绍 可选项  
UIApplicationShortcutItemIconFile 设置自定义标签图片文件的路径 可选项  
UIApplicationShortcutItemUserInfo 设置用户信息,是1个字典类型,可以用来传值 可选项

依照如上截图配置info.plist文件后,我们运行程序,然后按压icon,出现的是以下效果:


静态添加的标签

这是在UIApplicationShortcutItems中添加了1个Item的情况,只添加了1个标签,如果想添加多个静态标签,依样画葫芦出多个Item便可。

动态添加入口标签

这类方法需要我们写代码来添加,首先来认识3个类:

类名 功能描写
UIApplicationShortcutItem 创建标签的类
UIMutableApplicationShortcutItem 创建可变标签的类
UIApplicationShortcutIcon 创建标签ICON的类

我们创建1个新工程,然后在工程中根视图的viewDidLoad方法中添加以下代码:

// 创建标签的ICON图标。 UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd]; // 创建1个标签,并配置相干属性。 UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"two" localizedTitle:@"么么哒" localizedSubtitle:@"爱你呦" icon:icon userInfo:nil]; // 将标签添加进Application的shortcutItems中。 [UIApplication sharedApplication].shortcutItems = @[item];

上边的代码,第1步创建出标签的入口,这1步的配置与静态添加标签中的UIApplicationShortcutItemIconType目的1样。系统给我们提供了以下样式的标签:

typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) { UIApplicationShortcutIconTypeCompose, UIApplicationShortcutIconTypePlay, UIApplicationShortcutIconTypePause, UIApplicationShortcutIconTypeAdd, UIApplicationShortcutIconTypeLocation, UIApplicationShortcutIconTypeSearch, UIApplicationShortcutIconTypeShare, UIApplicationShortcutIconTypeProhibit NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeContact NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeHome NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeMarkLocation NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeFavorite NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeLove NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeCloud NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeInvitation NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeConfirmation NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeMail NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeMessage NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeDate NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeTime NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeCapturePhoto NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeCaptureVideo NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeTask NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeTaskCompleted NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeAlarm NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeBookmark NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeShuffle NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeAudio NS_ENUM_AVAILABLE_IOS(9_1), UIApplicationShortcutIconTypeUpdate NS_ENUM_AVAILABLE_IOS(9_1) } NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;

如果系统图标不满足需求,可使用+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;添加自定义图片作为标签,需要注意的是:图片必须预先添加进bundle。

第2步是创建1个标签,并进行相干配置,这1步与静态添加标签中的Item01样,初始化中的相干设置和上边1模1样,不多啰嗦。

第3步是将标签添加进pplication的shortcutItems中,如果想添加多个标签,可以创建多个UIApplicationShortcutItem对象,并加入数组中。

添加完后,我们再次运行程序查看效果:


动态添加标签后的效果

检测App启动方式

标签添加完成了,现在我们可以通过两种途径来启动App,1种是传统的点击icon图标启动App,另外一种是通过按压icon唤起快速入口,通过快速入口进入App中指定的功能页面。我们要如何检测是从哪里进入App呢?

iOS9在AppDelegated中提供了1个新方法:- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler,如果App是从快速入口启动的,则会履行这个方法。该方法的shortcutItem参数携带了从快速入口进入app时的标签参数。

如果是从快速入口启动的App,我们可以判断shortcutItem.localizedTitle属性的值来判断是从哪个标签进入的App。

来1个需求:如果是从“点我”这个标签进来的,我们把页面背景色彩修改成黄色,如果是从“么么哒”这个标签进来的,我们讲页面背景色彩修改成红色。代码以下:

// 程序在后台运行,或从死亡被激活,从3d进来的页面 - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler { if ([shortcutItem.localizedTitle isEqualToString:@"点我"]) { self.window.rootViewController.view.backgroundColor = [UIColor yellowColor]; } else if ([shortcutItem.localizedTitle isEqualToString:@"么么哒"]) { self.window.rootViewController.view.backgroundColor = [UIColor redColor]; } }

彩蛋:如何在摹拟器中使用3D Touch功能?

上边我们讲了这么多,还是需要在iphone6s中来验证效果。对没有装备的同学们怎样办呢?我们可以安装1些插件,来让摹拟器支持1下3D Touch中的Home Screen Quick Actions模块功能。

首先我们需要在gitHub中下载1个插件,这个插件只能安装在Xcode7中。地址在这里:https://github.com/DeskConnect/SBShortcutMenuSimulator

剩下的依照这个页面的指引操作就能够了。为了照顾1下懒得看英文的同学,在这里我把操作步骤罗列出来。

插件安装篇

1、 在终端中输入命令git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git克隆该插件到本地。


克隆插件

2、 继续输入命令cd SBShortcutMenuSimulator进入插件所在文件夹

3、输入命令make安装插件


安装插件

插件使用篇

1、输入命令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启动插件

2、输入命令来唤起某个App的Home Screen Quick Actions功能:echo 'com.apple.mobilecal' | nc 127.0.0.1 8000。其中的com.apple.mobilecal是你的bundle id。命令履行效果以下:


命令履行效果

我们把bundle id换为我们刚刚写的工程的ID,测试1下echo 'quanzheng.-DTouchDemo' | nc 127.0.0.1 8000



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐