一、3D Touch 的简单介绍

①主屏幕的快捷操作:

在主屏幕按压app图标,有两种类型:静态操作(在info.plist中添加UIApplicationShortcutItems数组)和动态操作(利用 UIApplicationShortcutItem类和可用的api 创建新的对象,并将对象添加到shared UIApplication 的新属性 shortcutItems中去)。这两种操作,最多展示两行文字,和一个可以没有的图片。

②Peek And Pop

在iOS9之后,开发者可以使每一个UIViewController 类型的对象(包括子类)响应用户的压力操作,随着持续的压力操作,每一次都会经历3个过程:
1、预览内容(preview)是否可得到的
2、展示预览内容(preview),这也就是Peek; 同时也可以展示可以选择的事件 也就是peek quick actions
3、将preview正常展示 — 也就是pop

③Force Properties (压力属性)

在iOS9中,有两个新的属性来支持在app中实现3D Touch:force和maximumPossibleForce这些属性是你能够察觉到用户给予的压力在你APP接收的UIEvent对象中。

二、3D Touch 的使用

①检查3D Touch 是否可用(在controller中可以用如下方法检查)

if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {NSLog(@"支持3d-touch");
}
//枚举如下
typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
UIForceTouchCapabilityUnknown = 0,
UIForceTouchCapabilityUnavailable = 1,
UIForceTouchCapabilityAvailable = 2
};

②主屏幕快捷操作

1、静态,在info.plist中添加 UIApplicationShortcutItems数组

最多可以展示四个元素,每个元素都是一个字典,其中包含的见键值对有:

UIApplicationShortcutItemType(必要键值对)字符串类型

在用户点击主屏幕出现的快捷操作之后,在appdelegate的委托方法中,可以使用该名称来判断是哪一个快捷操作被触发了,从而进行相关的操作。

UIApplicationShortcutItemTitle (必要键值对) 字符串类型

quick action 的名称,如果名字长度过长,而且没有指定subtitle 那么会显示两行,如果指定的suntitle那么将以省略号表示。

UIApplicationShortcutItemSubtitle  字符串类型

quick action 的子标题,通常用于描述该快捷操作,单行显示,多余的以省略号表示。

UIApplicationShortcutItemIconType  字符串类型

该快操作的图标(从系统所提供的图标选取);详细可以见UIApplicationShortcutIcon类中的UIApplicationShortcutIconType枚举,枚举如下:

typedef enum UIApplicationShortcutIconType : NSInteger {
UIApplicationShortcutIconTypeCompose,
UIApplicationShortcutIconTypePlay,
UIApplicationShortcutIconTypePause,
UIApplicationShortcutIconTypeAdd,
UIApplicationShortcutIconTypeLocation,
UIApplicationShortcutIconTypeSearch,
UIApplicationShortcutIconTypeShare,
UIApplicationShortcutIconTypeProhibit,
UIApplicationShortcutIconTypeContact,
UIApplicationShortcutIconTypeHome,
UIApplicationShortcutIconTypeMarkLocation,
UIApplicationShortcutIconTypeFavorite,
UIApplicationShortcutIconTypeLove,
UIApplicationShortcutIconTypeCloud,
UIApplicationShortcutIconTypeInvitation,
UIApplicationShortcutIconTypeConfirmation,
UIApplicationShortcutIconTypeMail,
UIApplicationShortcutIconTypeMessage,
UIApplicationShortcutIconTypeDate,
UIApplicationShortcutIconTypeTime,
UIApplicationShortcutIconTypeCapturePhoto,
UIApplicationShortcutIconTypeCaptureVideo,
UIApplicationShortcutIconTypeTask,
UIApplicationShortcutIconTypeTaskCompleted,
UIApplicationShortcutIconTypeAlarm,
UIApplicationShortcutIconTypeBookmark,
UIApplicationShortcutIconTypeShuffle,
UIApplicationShortcutIconTypeAudio,
UIApplicationShortcutIconTypeUpdate
}UIApplicationShortcutIconType;

以上为UIApplicationShortcutIconType枚举

UIApplicationShortcutItemIconFile  字符串

icon图片的路径,用户可以使用该键值对来使用自定义的图片;icon应当是正方形、单色,大小为35×35points
如果在工程中拖入一个图片,那么它的路径不需要前面的bundle路径。在用户自定义图像和系统图像都存在时,会展示用户自定的图像。

UIApplicationShortcutItemUserInfo  字典

用户信息;An optional, app-defined dictionary. One use for this dictionary is to provide app version information, as described in the “App Launch and App Update Considerations for Quick Actions” section of the overview in UIApplicationShortcutItem Class Reference.

2、动态

①添加
在app运行之后添加,添加方式如下(可以在一个你想添加的时机添加,比如一个ViewController的某个方法)

 //创建图标,可以不要
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeFavorite]; //系统图标
//创建item
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"love" localizedTitle:@"我喜欢" localizedSubtitle:nil icon:icon1 userInfo:nil];UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"itemIcon.jpg"]; //自定义图标
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"gohome" localizedTitle:@"回家" localizedSubtitle:nil icon:icon2 userInfo:nil];//动态添加
[UIApplication sharedApplication].shortcutItems = @[item1,item2];

②修改
要修改当前app的shortcutItem 就要先获得当前的shortcutItems
通过方法

NSArray *shortcutItemsArray = [UIApplication sharedApplication].shortcutItems;

便可以获得。但是这里需要注意一点,该方法获取不到静态的shortcutItem。
接下来是更改

 //创建一个可以更改的数组
NSMutableArray *shortcutItemsArray = [[UIApplication sharedApplication].shortcutItems mutableCopy];
//创建新的item
UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"哈哈哈" localizedTitle:@"a"];
[shortcutItemsArray replaceObjectAtIndex:0 withObject:item];
//重新赋值给UIApplication
[UIApplication sharedApplication].shortcutItems = shortcutItemsArray;

可以看到更改后的效果如下;

如果只是想更改某一个shortcutItem的某个属性,那么就取出该item进行mutableCopy然后更改再进行赋值(更改后替换可修改数组中的对应元素,然后再将数组赋给[UIApplication sharedApplication].shortcutItems)。修改方式如下:

 UIMutableApplicationShortcutItem *muItem = [[shortcutItemsArray objectAtIndex:0] mutableCopy];
[muItem setLocalizedTitle:@"哈哈哈"];

如图所示,最底下的一行是添加的静态快捷方式,通过[UIApplication sharedApplication].shortcutItems方法的获取的数组,只能获取到“a”和“回家”这两个动态快捷方式,他们在数组中的顺序分别是从下到上,也就是说是“a”是第一个元素。

3、从主屏幕的快捷操作启动app

触发主屏幕的shortcutItem后会执行appDelegate中的

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;

方法,但是如果以下两个方法其中的任意一个返回了NO 该委托方法将不会被执行

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

根据苹果官方的demo我们需要做的是:
在appDelegate中创建一个实例变量或者属性

@property (nonatomic, strong) UIApplicationShortcutItem *launchedShortcutItem;

在appDelegate中创建一个方法,并在其中写入如下代码

- (BOOL)handleShortcutItems:(UIApplicationShortcutItem *)shortcutItem {
BOOL handled = NO;
if (shortcutItem.type == nil) {return NO;
}
if (![shortcutItem.type isKindOfClass:[NSString class]]) {return NO;
}
//判断类型
if ([shortcutItem.type isEqualToString:@"CQTouch"]) {handled = YES;//你想执行的指定操作TableViewController *viewController = [[TableViewController alloc] init];UINavigationController *nav = (UINavigationController*)self.window.rootViewController;[nav pushViewController:viewController animated:YES];
}
return handled;
}

接着在接收从shortcutItem的方法中写入

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
BOOL x = [self handleShortcutItems:shortcutItem];
completionHandler(x);
}

再然后在下面方法中写入

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
if (shortcutItem) {_launchedShortcutItem = shortcutItem;return NO;
}
return YES;
}

最后在程序成为Active的状态时写入

- (void)applicationDidBecomeActive:(UIApplication *)application {[self handleShortcutItems:_launchedShortcutItem];
_launchedShortcutItem = nil;
}

至此,程序便能够从主屏幕的快捷方式进入app内部指定的操作。来分析一下这个方法的流程,两种情况:
第一种,程序未启动时;未启动时程序执行会先执行- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions;方法,在该方法中我们可以通过读取launchOptions中键名为UIApplicationLaunchOptionsShortcutItemKey的值,来获取shortcutItem,如果获取的存在,那么就return NO; 前面说过返回否就不会执行,shortcutItem的委托方法;接着程序变为active状态,那么就会执行[selfhandleShortcutItems:_launchedShortcutItem] 此时就会进入到我们写的方法,执行相应的操作,完成后会将属性launchedShortcutItem置为nil;
第二种,程序已经在后台;点击shortcutItem就会触发委托方法,在委托方法中执行了[self handleShortcutItems:shortcutItem],也就是说采取了特定操作,接着app进入active状态,执行[selfhandleShortcutItems:_launchedShortcutItem],因为此时属性launchedShortcutItem为nil,就会迅速返回nil,也完成了特定操作。

但是肯定会有人想,那么直接在触发shortcutItem程序所执行的委托方法中执行判断和相应操作行不行呢?也就是说省略掉其他三个地方的操作,经过我的测试发现程序也能够正常从shortcutItem运行,因此我未能理解到苹果爸爸这样做的奥义所在,我也未能够理解点击shortcutItem所执行的委托方法中的completionHandler(x)。

在研究的过程中我有一个疑问,如果我连续多次使用主屏幕快捷键功能会怎么样呢?按照之前的代码操作,一定是push出很多viewController这样未免有些不精致;于是我掏出手机检测了一些app是否存在这些问题,经过我的检测QQ、贴吧等都存在这种问题;系统的应用以及微信和极少的三方应用会处理这个问题,不过这个问题也只是处女座的受不了,还有不一定有人这么用。

(由于博客篇幅问题,剩下的在下一篇中)

iOS开发3DTouch(一)相关推荐

  1. iOS开发 3D-touch使用

    3D Touch的触控技术,被苹果称为新一代多点触控技术.3D Touch,苹果iPhone 6s的新功能,看起来类似 PC 上的右键.有Peek Pop 两种新手势.iOS 9提供了如下3D Tou ...

  2. iOS开发 swift 3dTouch实现 附代码

    iOS开发 swift 3dTouch实现 附代码 一.What? 从iphone6s开始,苹果手机加入了3d touch技术,最简单的理解就是可以读取用户的点击屏幕力度大小,根据力度大小给予不同的反 ...

  3. iOS开发——BAT网易笔试面试题参考答案

    阿里B2B - 一面 1,load方法执行顺序,分类和主类的load方法顺序,两个分类的load方法顺序,跟main函数的顺序 2,sqllite的跟orcale这些大型的数据库的机制有什么不同的? ...

  4. iOS开发常用三方库、插件、知名博客

    TimLiu-iOS iOS开发常用三方库.插件.知名博客等等,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交Issues即可). 持续更新... 版本:Objective- ...

  5. iOS开发第三方大全

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

  6. iOS开发之资料收集

    github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自github:https://github ...

  7. iOS 开发第三方库全集

    下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableVie ...

  8. iOS开发常用第三方开源框架

    iOS开发-常用第三方开源框架倾情整理!简书:https://www.jianshu.com/p/29cb22b13d79 iOS第三方库大全:https://blog.csdn.net/kanggu ...

  9. ios非常全的库iOS开发 非常全的三方库、插件、大牛博客等等

    转自: TimLiu-iOS Swift版本点击这里欢迎加入交QQ流群: 594119878 github排名 https://github.com/trending,github搜索:https:/ ...

最新文章

  1. signature=6e39b7285090b9748e35514dc5472d29,PXE常见错误代码表
  2. MySQL复制类型介绍
  3. Dubbo系统间通信
  4. paip sms to blog.txt
  5. NSURLSessionDataTask与NSOperationQueue实现多文件断点下载(任意时刻终止进程,重启应用,自动重启下载)...
  6. Tomcat到Wildfly:配置数据库连接
  7. [Unity][FlowCanvas] 预制体中新建的组件无法拖入 GameObject 类型的黑板的解决办法:关闭预制体之后再打开
  8. C++安全方向(三)3.4 使用哈希列表验证文件的完整性
  9. 调度失败:执行器地址为空_三千字带你搞懂XXL-JOB任务调度平台
  10. 【数据结构】树状数组效果讲解
  11. activity 和service通信,调用service方法
  12. html搜索联系人,联系人列表.html
  13. 辞职文案火了,程序员的辞职理由要命不要钱。
  14. 基于lio-sam框架,教你如何进行回环检测及位姿计算
  15. 门禁系统服务器未连接,门禁系统一般故障处理方法及如何选择电插锁
  16. 离散数学 --- 谓词逻辑 --- 谓词符号化与谓词合式公式
  17. Linux上如何使用微信?
  18. Pyecharts 静态图片输出ppt中动态图表
  19. MySQL实现字符串分割split并获取长度
  20. java-net-php-python-jspm旅游预订系统计算机毕业设计程序

热门文章

  1. vscode官方下载太慢解决办法
  2. 【新邮件】叮!你的美通社日历已Ready!
  3. spark读取PMML文件
  4. 面试题:你能写一个 Vue 的双向数据绑定吗?
  5. springboot验证码整合
  6. [知识图谱]-Neo4j图数据库安装及药材图谱实现
  7. 1355 巧克力 (线段树点+区间)
  8. visual studio code配置项 settings.json
  9. Linux基础自学笔记2
  10. Java拼接字符串 拼接双引号