美文网首页知识积累iOS DeveloperiOS学习笔记
关于iOS的3D Touch 的简单使用,以及个人心得

关于iOS的3D Touch 的简单使用,以及个人心得

作者: Mondo_杰 | 来源:发表于2016-04-13 16:49 被阅读1645次

·前言

前段时间因为对3D Touch感兴趣,研究了一下,发现网上的教程很多,很杂乱,所以在此整理一下,弄一个完整的,自己容易看懂的笔记。以便以后用到的时候再花时间去找。

·工具

恩,3D Touch 是需要6s以上的设备支持的,不过呢,技术没有难题,有牛人在github上为我们提供了一个插件,可以让我们在模拟器上进行3D Touch的效果测试:

我是插件,点我点我!

那个,具体用法我这里就不写了。大家捣鼓捣鼓就出来了。因为我也没用过😢;

ps: 由于本人比较懒,所以可能有些图就网上盗去了,

·正题

一、在icon处直接响应的功能模块

我们先来看看效果

ps:这个最多可以设置4个标签,每个标签后面可以跟一个图标

响应icon的有两种方式

1、在info.plist文件里面配置

这种也叫静态标签

我们来看看我是怎样写的,话不多说,先直接上图

先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:

必填项(下面两个键值是必须设置的):

·UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串,用于点击后响应不同的事件

·UIApplicationShortcutItemTitle 这个键值设置标签的标题

·

选填项(下面这些键值不是必须设置的) :

·UIApplicationShortcutItemSubtitle 设置标签的副标题

·UIApplicationShortcutItemIconFile 设置标签的Icon文件(也就是图片)

·UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)

2、 在代码里面添加

这种叫动态标签

    /** 
type 该item 唯一标识符
 localizedTitle :标题
 localizedSubtitle:副标题
 icon:icon图标 可以使用系统类型 也可以使用自定义的图片
 userInfo:用户信息字典 自定义参数,完成具体功能需求
 */
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"item1@3x.png"];
UIApplicationShortcutIcon *cameraIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];
UIApplicationShortcutItem *cameraItem = [[UIApplicationShortcutItem alloc] initWithType:@"item1" localizedTitle:@"拍照" localizedSubtitle:@"" icon:cameraIcon userInfo:nil];

UIApplicationShortcutIcon *shareIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"item2" localizedTitle:@"分享" localizedSubtitle:@"" icon:shareIcon userInfo:nil];
/** 将items 添加到app图标 */
application.shortcutItems = @[cameraItem,shareItem];
ok,icon的入口我们弄完了。接下来就是是重点

二、响应标签的行为

其实这玩意儿和推送的原理差不多,都是根据标签的type来进行相关的逻辑操作。接下来看我的:

首先在AppDelegate里面添加如下方法

- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
  completionHandler:(void(^)(BOOL succeeded))completionHandler
{ 
}

在上面这个方法里面写一个UINavigationController

UINavigationController *nav = (UINavigationController *)self.window.rootViewController;

判断先前我们设置的唯一标识,根据标识符推送到指定的Controller

if([shortcutItem.type isEqualToString:@"one"]){
     oneViewController *vc = [[oneViewController alloc] init];
    [nav pushViewController:vc animated:YES];  
}else if ([shortcutItem.type isEqualToString:@"two"]){
    twoViewController *vc = [[twoViewController alloc] init];
    [nav pushViewController:vc animated:YES];
}

ok,点击推送的也就搞定了

三、点击tableView的cell界面预览

1、在tableView的代理方法里面加上如下代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    cell.textLabel.text = self.dataSource[indexPath.row];
    cell.textLabel.numberOfLines = 0;
    // 这里判断是否支持3D Touch功能
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        NSLog(@"3D Touch  可用!");
        //如果支持,给cell注册3DTouch的peek(预览)和pop功能
        [self registerForPreviewingWithDelegate:self sourceView:cell];
    } else {
        NSLog(@"3D Touch 无效");
    }
    return cell;
}

实现代理 UIViewControllerPreviewingDelegate

2、实现UIViewControllerPreviewingDelegate的代理方法

效果图如下:

// 预览效果
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
    // 记录是哪一个cell被按,[previewingContext sourceView]就是按压的那个视图
    NSIndexPath *index = [self.tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
    // 设定预览界面
    showViewController *showVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"showViewController"];
    showVC.titleLabel.text = self.dataSource[index.row];
    showVC.preferredContentSize = CGSizeMake(0, 500);
    //调整不被虚化的范围,按压的那个cell不被虚化(轻轻按压时周边会被虚化,再少用力展示预览,再加力跳页至设定界面)
    CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,40);
    previewingContext.sourceRect = rect;
    
    return showVC;
}

// 用力按进入的controller
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
    [self showViewController:viewControllerToCommit sender:self];
}

3、在预览的controller里面设置action

效果图如下:

直接上代码

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"第一个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        // 点击事件写到这里
    }];
    
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"第2个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"第3个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewAction *action4 = [UIPreviewAction actionWithTitle:@"第4个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    NSArray *action = @[action1,action2,action3,action4];
    
    return action;
}

·好了,大概就是这么多了,关于获取到压力值的那个东西我正在测试,空闲的时候我会贴上来。

ps 这是个人见解,如果有不对的地方,欢迎留言指出,大家相互探讨。谢谢!!

相关文章

网友评论

本文标题:关于iOS的3D Touch 的简单使用,以及个人心得

本文链接:https://www.haomeiwen.com/subject/kttglttx.html