3D Touch的基本使用

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

猜你喜欢

转载自blog.csdn.net/qq_30963589/article/details/77837849