3D Touch主要的使用场景为两个,一个静态这设置,一个动态添加,还有包括修改UIApplicationShortcutItem,peek(预览)和pop(跳转)的实现。
应用最多添加4个快捷选项标签,iOS给我们提供了2种方式开发。
一、静态的标签实现
打开项目的plist文件,添加如下项(需要我们手工添加)
或者代码编写plist
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconFile</key>
<string>open-favorites</string>
<key>UIApplicationShortcutItemTitle</key>
<string>Favorites</string>
<key>UIApplicationShortcutItemType</key>
<string>com.mycompany.myapp.openfavorites</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>key1</key>
<string>value1</string>
</dict>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeCompose</string>
<key>UIApplicationShortcutItemTitle</key>
<string>New Message</string>
<key>UIApplicationShortcutItemType</key>
<string>com.mycompany.myapp.newmessage</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>key2</key>
<string>value2</string>
</dict>
</dict>
</array>
UIApplicationShortcutItems:数组中的元素就是我们的那些快捷选项标签。
UIApplicationShortcutItemTitle:标签标题(必填)
UIApplicationShortcutItemType:标签的唯一标识(必填)
UIApplicationShortcutItemIconType:使用系统图标的类型,如搜索、定位、home等(可选)
UIApplicationShortcutItemIconFile:使用项目中的图片作为标签图标(可选)
UIApplicationShortcutItemSubtitle:标签副标题(可选)
UIApplicationShortcutItemUserInfo:字典信息,如传值使用(可选)
二、动态标签的实现
1、在AppDelegate.m文件中加如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UINavigationController *Nav = [[UINavigationController alloc] initWithRootViewController:[[TestOneViewController alloc] init]];
self.window.rootViewController = Nav;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
//设置3D Touch 标签
NSMutableArray *arrShortcutItem = (NSMutableArray *)[UIApplication sharedApplication].shortcutItems;
//icon 快捷按钮的图标 可以自定义
//创建系统风格的icon
// UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
//创建自定义图标的icon
// UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"分享.png"];
UIApplicationShortcutItem *shoreItem1 = [[UIApplicationShortcutItem alloc] initWithType:@"cn.damon.DM3DTouchDemo.openSeach" localizedTitle:@"搜索" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch] userInfo:nil];
[arrShortcutItem addObject:shoreItem1];
UIApplicationShortcutItem *shoreItem2 = [[UIApplicationShortcutItem alloc] initWithType:@"cn.damon.DM3DTouchDemo.openCompose" localizedTitle:@"新消息" localizedSubtitle:@"新消息副标题" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose] userInfo:nil];
[arrShortcutItem addObject:shoreItem2];
[UIApplication sharedApplication].shortcutItems = arrShortcutItem;
return YES;
}
效果图:
2、点击快捷键标签进入对应的响应
在AppDelegate.m中加入代码:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
//这里可以获的shortcutItem对象的唯一标识符
//不管APP在后台还是进程被杀死,只要通过主屏快捷操作进来的,都会调用这个方法
NSLog(@"name:%@\ntype:%@", shortcutItem.localizedTitle, shortcutItem.type);
UINavigationController *Nav = [[UINavigationController alloc] initWithRootViewController:[[TestOneViewController alloc] init]];
self.window.rootViewController = Nav;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
//判断跳转界面
if ([shortcutItem.type isEqualToString: @"cn.damon.DM3DTouchDemo.openCompose"]) {
TestTowViewController *TwoVC = [[TestTowViewController alloc] init];
[Nav pushViewController:TwoVC animated:YES];
}else if ([shortcutItem.type isEqualToString: @"cn.damon.DM3DTouchDemo.openSeach"]){
SeachViewController *VC = [[SeachViewController alloc] init];
[Nav pushViewController:VC animated:YES];
}else if ([shortcutItem.type isEqualToString: @"com.mycompany.myapp.openfavorites"]){
SeachViewController *VC = [[SeachViewController alloc] init];
[Nav pushViewController:VC animated:YES];
}
if (completionHandler) {
completionHandler(YES);
}
/* 也可以在这里面修改UIApplicationShortcutItem */
}
3、peek ( 预览 ) 和pop(跳转到预览的界面)
首先注册peer和pop功能,以我的代码为例,想点击TestOneViewController中的cell,预览TestTwoViewController界面,然后跳转到TestTwoViewController界面,那就先在TestOneViewController里面注册,并继承协议UIViewControllerPreviewingDelegate
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSArray *arr = @[@"test1",@"test2"];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
cell.textLabel.text = arr[indexPath.row];
//注册3D Touch
/**
从iOS9开始,我们可以通过这个类来判断运行程序对应的设备是否支持3D Touch功能。
UIForceTouchCapabilityUnknown = 0, //未知
UIForceTouchCapabilityUnavailable = 1, //不可用
UIForceTouchCapabilityAvailable = 2 //可用
*/
if ([self respondsToSelector:@selector(traitCollection)]) {
if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)]) {
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:(id)self sourceView:cell];
}
}
}
return cell;
}
然后实现UIViewControllerPreviewingDelegate方法:
#pragma mark - 3D Touch代理 UIViewControllerPreviewingDelegate
//预览图
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
NSArray *arr = @[@"1",@"2"];
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
//创建要预览的控制器
TestTowViewController *TwoVC = [[TestTowViewController alloc] init];
TwoVC.InfoStr = arr[indexPath.row];
TwoVC.index = indexPath.row;
//指定当前上下文视图Rect
CGRect rect = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300);
previewingContext.sourceRect = rect;
return TwoVC;
}
//从预览图跳转进入TestTwo 控制器
//(用力按压 跳转)
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
[self showViewController:viewControllerToCommit sender:self];
}
预览界面的设置和向上拖拽预览图生成快捷键的代码需要在TestTowViewController.m里面设置:
//3D Touch 预览图时 向上拖拽得到的快捷功能菜单
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
NSMutableArray *arrItem = [NSMutableArray new];
UIPreviewAction *previewAction0 = [UIPreviewAction actionWithTitle:@"取消" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//
NSLog(@"didClickCancel");
}];
UIPreviewAction *previewAction1 = [UIPreviewAction actionWithTitle:@"替换元素" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//
NSLog(@"替换元素");
}];
[arrItem addObjectsFromArray:@[previewAction0,previewAction1]];
return arrItem;
}
效果图如下:
这就是基本的 3D Touch的运用。
源码:https://github.com/Jadekirin/3D-TouchTest.git。