3D Touch是苹果在2015年秋季发布会上发布了iPhone 6S的新功能,具体功能是用力按一个图标会弹出一层半透明菜单,里面包含了该应用下的一些快捷操作.
下面和大家分享一下简单的实现
1、静态标签
静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序会在动态标签的前面。
我们先来看静态标签的配置:
首先,在info.plist文件中添加如下键值(我在测试的时候,系统并没有提示,只能手打上去):
先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:
必填项(下面两个键值是必须设置的):
UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串
UIApplicationShortcutItemTitle 这个键值设置标签的标题
选填项(下面这些键值不是必须设置的) :
UIApplicationShortcutItemSubtitle 设置标签的副标题
UIApplicationShortcutItemIconType 设置标签Icon类型
UIApplicationShortcutItemIconFile 设置标签的Icon文件
UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)
我们如上截图设置后,运行程序,用我们前面的方法进行测试,效果如下:
2、动态标签
动态标签是我们在程序中,通过代码添加的,与之相关的类,主要有三个:
UIApplicationShortcutItem 创建3DTouch标签的类
UIMutableApplicationShortcutItem 创建可变的3DTouch标签的类
UIApplicationShortcutIcon 创建标签中图片Icon的类
在AppDelegate.m文件中
@interface AppDelegate ()
@property(nonatomic,strong)TabBarViewController *tabBar;
@property(nonatomic,strong)RZSportsVC *picker1;
@property(nonatomic,strong)LJHNewRunViewController1 *LJHVC;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//查看系统版本号
CGFloat currentDeviceVersionFloat = [[[UIDevice currentDevice] systemVersion] floatValue];
if (currentDeviceVersionFloat >= 9.0) {
UIApplicationShortcutIcon *iconFitness = [UIApplicationShortcutIcon iconWithTemplateImageName:@"健身训练"];
//菜单文字
UIMutableApplicationShortcutItem *itemFitness = [[UIMutableApplicationShortcutItem alloc] initWithType:@"1" localizedTitle:@"健身训练"];
//绑定信息到指定菜单
itemFitness.icon = iconFitness;
// 菜单图标
UIApplicationShortcutIcon *iconRun = [UIApplicationShortcutIcon iconWithTemplateImageName:@"跑步"];
//菜单文字
UIMutableApplicationShortcutItem *itemRun = [[UIMutableApplicationShortcutItem alloc] initWithType:@"2" localizedTitle:@"户外跑步"];
//绑定信息到指定菜单
itemRun.icon = iconRun;
//绑定到App icon
application.shortcutItems = @[itemFitness,itemRun];
}
return YES;
}
响应事件如下
- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler{
//点击第一条
if ([shortcutItem.type isEqualToString:@"1"]) {
UINavigationController *myNavi = self.window.rootViewController.childViewControllers[0];
_tabBar.selectedIndex = 0;
_picker1 = [[RZSportsVC alloc]init];
//如果已经进入到界面里面,先返回在进入这个界面,避免重复进入同一个界面
if ([[NSUserDefaults standardUserDefaults]boolForKey:@"3d"]) {//在进入界面之后要保存一个BOOL值,已经由3d Touch 进入的,界面消失的时候将它移除掉
[myNavi popViewControllerAnimated:NO];
[myNavi pushViewController:_picker1 animated:YES ];
}else{
[myNavi pushViewController:_picker1 animated:YES ];
}
}
//点击第二条
if ([shortcutItem.type isEqualToString:@"2"]) {
UINavigationController *myNavi = self.window.rootViewController.childViewControllers[1];
_tabBar.selectedIndex = 1;
_LJHVC = [[LJHNewRunViewController1 alloc]init];
if ([[NSUserDefaults standardUserDefaults]boolForKey:@"3d1"]) {//在进入界面之后要保存一个BOOL值,已经由3d Touch 进入的,界面消失的时候将它移除掉
[myNavi popViewControllerAnimated:NO];
[myNavi pushViewController:_LJHVC animated:YES ];
}else{
[myNavi pushViewController:_LJHVC animated:YES ];
}
}
}
效果如下: