给应用添加
3D Touch的菜单(主屏交互Home Screen Interaction)一共有2种方式:静态添加(Info.plist方式) 和动态添加(纯代码方式)。
静态添加
直接在info.plist文件中设置如下字段:
-
UIApplicationShortcutItems:主屏交互的按钮指定的模型类。 -
UIApplicationShortcutItemType:主屏交互中使用的按钮的唯一标示符(必填),用作判断点击了哪一个快捷按钮。 -
UIApplicationShortcutItemIconFile:主屏交互中使用的按钮图片名(可选),可直接使用系统图标如UIApplicationShortcutIconTypeAdd,也可以使用自定义图标,推荐图标为一倍大小35*35的单色图片,图片需要背景透明才能显现出图片样式,图标会被渲染成黑色。 -
UIApplicationShortcutItemTitle:主屏交互中使用的按钮名称(必填)。 -
UIApplicationShortcutItemSubtitle:快捷可选项的子标题(可选)。 -
UIApplicationShortcutItemUserInfo:快捷可选项的附加信息(可选)。
苹果准备的系统icon图片:
动态添加
通过UIApplicationShortcutIcon创建图标.
通过UIApplicationShortcutItem来创建菜单item对象.
把item数组赋值给[UIApplication sharedApplication].shortcutItems
实例代码:在AppDelegate里面实现
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//1、创建窗口
self.window = [[UIWindow alloc] init];
self.window.frame = [UIScreen mainScreen].bounds;
self.window.rootViewController = [[MainTabBarController alloc] init];
//2、显示窗口(成为主窗口)
[self.window makeKeyAndVisible];
//3、创建3DTouch快捷方式
//创建快捷视图列表有两种方法,一种是这样用代码写,另一种是编辑info.plist文件中的UIApplicationShortcutItems
//系统限制每个App最多能够显示4个Action Item,其中包括静态方式和动态方式进行创建的;
//如果静态和动态方式同时使用的时候,给UIApplication的shortcutItems赋值的时候不会覆盖,静态加载的Item会排在前面
if (self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){//判断是否支持3DTouch,模拟器运行的话要去掉判断,否则不调用下面代码
[self create3DTouchShotItems];
}
return YES;
}
//创建3DTouch快捷视图列表
- (void)create3DTouchShotItems
{
//创建快捷item的icon UIApplicationShortcutItemIconFile
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];//选择系统提供的图标
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"setting"];//选择本地图片,推荐一倍大小为35*35,图片需要背景透明才能显现出图片样式,否则为全黑样式
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
//创建快捷item的userinfo UIApplicationShortcutItemUserInfo
NSDictionary *info1 = @{@"url":@"info1"};
NSDictionary *info2 = @{@"url":@"info2"};
NSDictionary *info3 = @{@"url":@"info3"};
//创建ShortcutItem
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"item1" localizedTitle:@"title1" localizedSubtitle:@"subtitle1" icon:icon1 userInfo:info1];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"item2" localizedTitle:@"title2" localizedSubtitle:@"subtitle2" icon:icon2 userInfo:info2];
UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"item3" localizedTitle:@"title3" localizedSubtitle:nil icon:icon3 userInfo:info3];
//添加到快捷选项数组
[UIApplication sharedApplication].shortcutItems = @[item1,item2,item3];
}
监听主屏交互按钮的点击事件
成功设置好主屏交互的快捷按钮后,我们剩下要做的就是在APP内监听快捷按钮的点击事件,此时我们就需要用到UIApplicationShortcutItemType快捷按钮的唯一标示符。
//获取在快捷视图列表点击的item,并对其点击作出反应
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
MainTabBarController *tabViewController = (MainTabBarController *) self.window.rootViewController;
MineVC *vc = [[MineVC alloc] init];
//判断设置的快捷选项标签唯一标识,根据不同标识执行不同操作
if([shortcutItem.type isEqualToString:@"item0"]){
MyLog(@"第一个按钮,响应默认方法直接打开应用");
}else if([shortcutItem.type isEqualToString:@"item1"]){
MyLog(@"第二个按钮,跳转到指定tab下的某一子界面");
//tabViewController.selectedViewController就是Nav控制器
[tabViewController.selectedViewController popToRootViewControllerAnimated:NO];//跳转到根目录下
tabViewController.selectedIndex = 2;//跳转到指定的tab
[tabViewController.selectedViewController pushViewController:vc animated:NO];//跳转到指定页面
}else if([shortcutItem.type isEqualToString:@"item2"]){
MyLog(@"第三个按钮,直接跳转到某一子界面");
[tabViewController.selectedViewController pushViewController:vc animated:NO];//跳转到指定页面
}else{
MyLog(@"第四个按钮,响应默认方法直接打开应用并打印参数信息");
[self clickedWithShortcutItem:shortcutItem];
}
}
-(void)clickedWithShortcutItem:(UIApplicationShortcutItem *)item
{
if (item.userInfo){
MyLog(@"%@",item.userInfo[@"obj"]);
}
}
注:如果想要模仿微信,程序从后台进入前台每次都展示启动页,需要设置
plist文件中的Application does not run in background为YES,默认为NO,程序在后台不运行。这样每次打开应用都是重新启动会默认展示首页。
如图所示:
运行图
遇到的问题:
1、在AppDelegate中添加是否支持3DTouch的判断,在模拟器上运行看不到效果,屏蔽判断代码可继续在模拟器上调试。
2、使用自定义图片时,图片被渲染成黑色的方块,如图所示:
推荐图标为一倍大小35*35的单色图片,图片需要背景透明才能显现出图片样式,同时图标会被主动渲染成黑色。
3、系统限制每个App最多能够显示4个ActionItem,其中包括静态方式和动态方式进行创建的;如果静态和动态方式同时使用的时候,给UIApplication的shortcutItems赋值的时候不会覆盖,静态加载的Item会排在前面,且会根据应用所在位置进行排序展示,如图所示:
参考:
https://www.jianshu.com/p/0a0f3cf25960
https://www.jianshu.com/p/14d91ec9a3b7
https://blog.csdn.net/weixin_30670965/article/details/98258829













网友评论