3D Touch简介
3D Touch 是苹果推出的一项屏幕技术,它通过识别用户按压屏幕的力度,提供更丰富的交互体验。
3D Touch的主要表现形式有三种:
-
主屏交互(Home Screen Interaction):在手机桌面上,用户可以通过用力按压应用图标来快速访问该应用的快捷操作菜单,这种方式可以在应用图标上静态或动态地添加快捷操作。
-
预览和跳转(Peek and Pop):用户在手机屏幕上用力按压想要预览的选项位置,可以弹出一个可以预览二级页面的预览窗口,如果继续用力,就可以直接打开或“Pop”进入该选项。
-
Live Photo:这是3D Touch技术的延伸,允许用户拍摄带有动态效果的照片。在待机画面上,通过3D Touch可以操作通知,而且可以将动态图片(Live Photo)设置为锁屏壁纸,通过不同力度的按压来预览动态效果。
3D Touch效果预览
主屏交互(Home Screen Interaction)
注意:
- 3D Touch支持系统版本为 iOS9及以上
- 自定义图标需要使用 镂空图标 ,同时建议 1倍图标大小为 35*35
- 快捷菜单是有数量限制的,最多添加 4个。
https://ycnsjibi4o6s.feishu.cn/docx/SpaydTt8loXARRxZlTKcM0kdnQc?from=from\\_copylink
当我们长按手机屏幕上的一些应用图标时,常会看到应用下方弹出的快捷菜单。这些菜单提供了快速入口,让我们能够立即打开应用并跳转到特定的功能页面,这就是 3D Touch 技术中的“主屏交互”功能。
主屏交互特点:
- 主屏交互的按钮有指定的模型类 UIApplicationShortcutItem,每个选项都是一个 UIApplicationShortcutItem。
- 主屏交互有两种配置方式,一种是 静态添加,一种是 动态添加。
1.静态添加
在项目工程的 info.plist 文件中添加 UIApplicationShortcutItems 属性。
这里配置了5项,长按应用图标实际只展示出来了4项(主屏交互快捷菜单限制4项没问题)
在 info.plist下 UIApplicationShortcutItems 列表内容
- UIApplicationShortcutItemType:快捷可选项中按钮的唯一标示,用作判断点击了哪一个快捷按钮(必填)
- UIApplicationShortcutItemTitle:快捷可选项中按钮名称(必填)
- UIApplicationShortcutItemSubtitle:快捷可选项的子标题(可选)
- UIApplicationShortcutItemIconType:快捷可选项的图标(可选)
- UIApplicationShortcutItemIconFile:快捷可选项的自定义图标名(可选)
- UIApplicationShortcutItemUserInfo:快捷可选项的附加信息(可选)
2.动态添加
动态添加就是通过生成 shortcutItem
对象数组,添加给 UIApplication
单例对象的 shortcutItems
使用系统icon,代码配置如下:
// 首页
UIApplicationShortcutItem *homeShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.home" localizedTitle:@"首页" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeHome] userInfo:nil];
// 我的
UIApplicationShortcutItem *carShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.qiche" localizedTitle:@"车辆" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose] userInfo:nil];
// 发现
UIApplicationShortcutItem *disShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.faxian" localizedTitle:@"发现" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch] userInfo:nil];
// 我的
UIApplicationShortcutItem *myShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.wode" localizedTitle:@"我的" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeTask] userInfo:nil];
// 赋值给Application的shortcutItems
[UIApplication sharedApplication].shortcutItems = @[homeShoreItem, carShoreItem, disShoreItem, myShoreItem];
使用自定义icon,代码配置如下:
// 首页
UIApplicationShortcutItem *homeShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.home" localizedTitle:@"首页" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_shouye_normal"] userInfo:nil];
// 我的
UIApplicationShortcutItem *carShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.qiche" localizedTitle:@"车辆" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_che_normal"] userInfo:nil];
// 发现
UIApplicationShortcutItem *disShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.faxian" localizedTitle:@"发现" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_discover_normal"] userInfo:nil];
// 我的
UIApplicationShortcutItem *myShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.wode" localizedTitle:@"我的" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_wode_normal"] userInfo:nil];
// 赋值给Application的shortcutItems
[UIApplication sharedApplication].shortcutItems = @[homeShoreItem, carShoreItem, disShoreItem, myShoreItem];
UIApplicationShortcutItem 配置内容
- type:快捷可选项的特定字符串(必填)
- localizedTitle:快捷可选项的标题(必填)
- localizedSubtitle:快捷可选项的子标题(可选)
- icon:快捷可选项的图标(可选)
- userInfo:快捷可选项的附加信息(可选)
主屏交互事件处理
注意:
- 处理主屏交互事件需要实现 AppDelegate 的 **
- (void)application: performActionForShortcutItem: completionHandler:
**代理方法- 如果你项目使用了**SceneDelegate****,那么需要实现
- (void)windowScene:performActionForShortcutItem:completionHandler:
**代理方法
成功设置好主屏交互的快捷按钮后,剩下要做的就是在APP内监听快捷按钮的点击事件,此时我们就需要用到 UIApplicationShortcutItemType
,快捷按钮的唯一标示符。
在 AppDelegate 中实现 -(void)application: performActionForShortcutItem: completionHandler:
代理方法
// AppDelegate.m
#pragma mark - ShortcutItem Click Delegate
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
//不管APP在后台还是进程被杀死,只要通过主屏快捷操作进来的,都会调用这个方法
//不管APP在后台还是进程被杀死,只要通过主屏快捷操作进来的,都会调用这个方法
if ([shortcutItem.type isEqualToString:@"com.touch.home"]) { // 首页
NSLog(@"首页");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.qiche"]) { // 车辆
NSLog(@"车辆");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.faxian"]) { // 发现
NSLog(@"发现");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.wode"]) { // 我的
NSLog(@"我的");
return;
}
}
在 SceneDelegate 中需要实现 **- (void)windowScene: performActionForShortcutItem: completionHandler:
**代理方法
// SceneDelegate.m
- (void)windowScene:(UIWindowScene *)windowScene performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
//不管APP在后台还是进程被杀死,只要通过主屏快捷操作进来的,都会调用这个方法
if ([shortcutItem.type isEqualToString:@"com.touch.home"]) { // 首页
NSLog(@"首页");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.qiche"]) { // 车辆
NSLog(@"车辆");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.faxian"]) { // 发现
NSLog(@"发现");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.wode"]) { // 我的
NSLog(@"我的");
return;
}
}
完整代码
// AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self createShortcuts];
return YES;
}
#pragma mark - ShortcutItem Click Delegate
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
//不管APP在后台还是进程被杀死,只要通过主屏快捷操作进来的,都会调用这个方法
//不管APP在后台还是进程被杀死,只要通过主屏快捷操作进来的,都会调用这个方法
if ([shortcutItem.type isEqualToString:@"com.touch.home"]) { // 首页
NSLog(@"首页");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.qiche"]) { // 车辆
NSLog(@"车辆");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.faxian"]) { // 发现
NSLog(@"发现");
return;
}
if ([shortcutItem.type isEqualToString:@"com.touch.wode"]) { // 我的
NSLog(@"我的");
return;
}
}
- (void)createShortcuts {
if ( @available(ios 9.1, *)) {
// 首页
UIApplicationShortcutItem *homeShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.home" localizedTitle:@"首页" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_shouye_normal"] userInfo:nil];
// 我的
UIApplicationShortcutItem *carShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.qiche" localizedTitle:@"车辆" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_che_normal"] userInfo:nil];
// 发现
UIApplicationShortcutItem *disShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.faxian" localizedTitle:@"发现" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_discover_normal"] userInfo:nil];
// 我的
UIApplicationShortcutItem *myShoreItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.touch.wode" localizedTitle:@"我的" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName: @"tab_wode_normal"] userInfo:nil];
// 赋值给Application的shortcutItems
[UIApplication sharedApplication].shortcutItems = @[homeShoreItem, carShoreItem, disShoreItem, myShoreItem];
}
}
@end
友情提示
见原文:【iOS特性】3D Touch主屏交互)
本文同步自微信公众号 “程序员小溪” ,这里只是同步,想看及时消息请移步我的公众号,不定时更新我的学习经验。