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

·前言

前段时间因为对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 这是个人见解,如果有不对的地方,欢迎留言指出,大家相互探讨。谢谢!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 专著:http://www.jianshu.com/p/3443a3b27b2d 1.简单的介绍一下3D Touc...
    violafa阅读 997评论 1 0
  • 1.简单的介绍一下3D Touch 3D Touch的触控技术,被苹果称为新一代多点触控技术。其实,就是此前在Ap...
    Camille_chen阅读 12,031评论 19 33
  • 一、3D Touch 介绍 3D Touch 是 Apple 推出的通过压力感触区分轻按和重按来进行不同的用户交互...
    Magician阅读 598评论 1 6
  • 11.16孩子你长大了,知道分辨是非对错了,在饮食上可以为健康而吃,没有过度的挑食。今晚你吃了妈妈做的出粮馒头,虽...
    曲红影阅读 212评论 0 1
  • 等我吃完全部的糖,如果你还没来找我,就算了吧