一、简介:
自从苹果公司引入了 3D Touch 功能后,众多开发者,也开在自己的app上实现自己的 3D Touch 效果,今天我也来小秀一把。
我们先来看看,3D Touch 下的 app 快速启动入口 是什么样的效果吧。
这是微信的app快速启动入口
这是 QQ 的 app快速启动入口
3D Touch的大致原理是:系统根据压力传感器检测到的屏幕上的压力力度的大小,来作出判断。
总体上,app 快速启动入口,分两种方式实现:
1. 静态添加
2. 动态添加
二 、静态添加:
静态添加这种方式比较方便快捷,只需要在 info.plist 文件上添加一个 叫 UIApplicationShortcutItems 的数组就行了,在这个数组中,我们可以添加多个标签,而每个标签是一个 字典,包含几个key,我们先来看看有哪些key吧。
- UIApplicationShortcutItemType 用于设置快捷通道类型的字符串,这个key是必须要有的,这个key的value可以为空。
- UIApplicationShortcutItemTitle 用于设置标签的title,这个key是必须要有的,不可以为空。
- UIApplicationShortcutItemIconFileSubtitle 用于设置标签的副标题,这个key可以没有,
- UIApplicationShortcutItemIconType 用于设置标签的系统图标,这个key可以没有
- UIApplicationShortcutItemIconFile 用于设置标签的自定义图标的路径,这个key可以没有
- UIApplicationShortcutItemUserInfo 用于设置用户信息,作为穿值用的,这个key可以没有
下面举个例子:
运行后的效果:
三、动态添加
所谓动态添加就是用代码的方式添加app快速启动入口,这种方式相对于静态添加而言,动态添加只能在第一次启动后,才能使用快速入口,而静态添加在app安装后,便可以使用了。
在动态添加方式中主要用到一下几个类:
- UIApplicationShortcutIcon 标签图标类
- UIApplicationShortcutItem 标签类
- UIMutableApplicationShortcutItem 可变标签类
我们创建一个新工程,然后在工程中根视图的viewDidLoad方法中添加如下代码:
// 第一步:创建一个系统图标
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];
// 第二步:创建一个标签,并配置相关属性。若有多个标签就创建多个item,然后在第三步中,把这些item放在数组中。
UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"123" localizedTitle:@"我是标题" localizedSubtitle:@"我是副标题" icon:icon userInfo:nil];
// 第三步:将标签添加进Application的shortcutItems中。
[UIApplication sharedApplication].shortcutItems = @[item];
其中,系统为我们提供了许多图标类型,这些类型在UIApplicationShortcutItemIconType这个结构体中,
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;
其中带 (9-1)字样的只能在9.1以上的系统中使用,其他的也只能在9.0以上的系统上使用。
我们运行一下来看看效果:
四、检测app的启动方式:
设置好了app的快速启动标签,我们来看看如何判断我们点击的是哪一个快速启动标签。
iOS 9在AppDelegate中为我们提供了一个新的方法:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
}
这个方法中的 shortcutItem 参数 携带了标签的各个属性值,我们可以通过 localizedTitle 这个属性的值,来判断,我们点击的是哪一个标签,并以此来做我们要处理的任务。
例如:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
//通过判断标题名字,来执行不同的任务
if ([shortcutItem.localizedTitle isEqualToString:@"我是标题1"]) {
//要处理的任务1
}
else if ([shortcutItem.localizedTitle isEqualToString:@"我是标题2"]) {
//要处理的任务2
}
}