概述

3DTouch是一种立体触控技术,被苹果称为新一代多点触控技术.

详细

代码下载:http://www.demodashi.com/demo/10708.html

6s和6s plus之后特有效果,对着应用图标用力按会触发3DTouch .

一、程序实现

第一步 : 3DTouch 设备支持检测:

检测当前的设备是否支持3DTouch

//  在iOS9中有一个新的枚举typedef NS_ENUM(NSInteger, UIForceTouchCapability) {  UIForceTouchCapabilityUnknown        = 0,  // 未知的支持属性UIForceTouchCapabilityUnavailable    = 1,  // 不支持UIForceTouchCapabilityAvailable      = 2 // 支持};

一般我们都在每个ViewController的生命周期中这样做:

定义一个是否设备支持的BOOL值属性

@property (nonatomic , assign) BOOL support3DTouch;

在生命周期函数中检测支持与否

  - (void)viewWillAppear:(BOOL)animated {  [super viewWillAppear:animated];  //检测当前是否支持3DTouch  self.support3DTouch = [self support3DTouch];  }

在生命周期外检测支持与否(因为有可能出了生命周期函数而发生了变化)

  - (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection NS_AVAILABLE_IOS(8_0) {     self.support3DTouch = [self support3DTouch];  }

检测是否支持3DTouch的方法

 - (BOOL)support3DTouch  {  // 如果开启了3D touch  if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)  {  return YES;  }  return NO;  }  }

第二步 : 配置快捷视图列表

创建快捷视图列表有两种方法:

1,一种是编辑info.plist文件中的UIApplicationShortcutItems,

通过可视化的界面添加键值对直接配置info.plist

2,另一种是使用代码在工程中加入items

在工程的 AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[HomeViewController alloc] init]];[self.window makeKeyAndVisible];//  代码创建快捷视图列表的方法,[self create3DTouchShotItems];return YES;
}

代码创建快捷视图列表的方法:

- (void)create3DTouchShotItems {//创建快捷item的icon UIApplicationShortcutItemIconFileUIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon1"];UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon2"];UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon3"];//创建快捷item的userinfo UIApplicationShortcutItemUserInfoNSDictionary *info1 = @{@"url":@"url1"};NSDictionary *info2 = @{@"url":@"url2"};NSDictionary *info3 = @{@"url":@"url3"};//创建ShortcutItemUIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"XS_3DTocuh_1" localizedTitle:@"扫一扫" localizedSubtitle:@"" icon:icon1 userInfo:info1];UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"XS_3DTocuh_2" localizedTitle:@"smile" localizedSubtitle:@"微笑面对生活" icon:icon2 userInfo:info2];UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"XS_3DTocuh_3" localizedTitle:@"购物" localizedSubtitle:@"Shopping" icon:icon3 userInfo:info3];NSArray *items = @[item1, item2, item3];[UIApplication sharedApplication].shortcutItems = items;
}

第三步 : 给列表视图中的cell注册 3DTouch 事件

  • 1,首先,在首页当前控制器里遵守UIViewControllerPreviewingDelegate协议

  • UIViewControllerPreviewingDelegate

  • 2,在注册前先判断是否设备支持(也就是第一步)

  • 3,注册: [self registerForPreviewingWithDelegate:self sourceView:cell];

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {ZLTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ZLTableViewCell"];if (cell == nil) {cell = [ZLTableViewCell cellWithTableView:tableView];}cell.dataFrame = self.dataSource[indexPath.row];//给cell注册代理,使其支持3DTouch手势if (self.support3DTouch) {[self registerForPreviewingWithDelegate:self sourceView:cell];}return cell;
}

第四步: 完成UIViewControllerPreviewingDelegate 协议回调,实现Peek Pop

在首页当前控制器里,

#pragma mark - 3DTouch  UIViewControllerPreviewingDelegate

Peek 实现代码:

此方法是轻按控件时,跳出peek的代理方法

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {//防止重复加入if ([self.presentedViewController isKindOfClass:[ZLPeekViewController class]]){return nil;}else{ZLTableViewCell *cell = (ZLTableViewCell *)previewingContext.sourceView;ZLCellData * cellData = cell.dataFrame.cellData;ZLPeekViewController *peekViewController = [[ZLPeekViewController alloc] init];peekViewController.cellData = cellData;peekViewController.delegate = self;return peekViewController;}
}

Pop 代码:

此方法是重按peek时,跳入pop的代理方法

- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContextcommitViewController:(UIViewController *)viewControllerToCommit {ZLTableViewCell *cell = (ZLTableViewCell *)previewingContext.sourceView;ZLCellData * cellData = cell.dataFrame.cellData;ZLPopViewController *popViewController = [[ZLPopViewController alloc] init];popViewController.cellData = cellData;// 以prentViewController的形式展现[self showViewController:popViewController sender:self];// 以push的形势展现
//    [self.navigationController pushViewController:popViewController animated:YES];
}

第五步 : 在Peek状态下向上滑动出现的按钮配置方法

在 ZLPeekViewController.m 里, 实现 - (NSArray> *)previewActionItems 回调方法

#pragma mark - Preview Actions
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {// 生成UIPreviewActionUIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"事件 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {NSLog(@"Action 1 selected");[self.delegate pushToPopViewControllerWithCellData:self.cellData];}];UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"事件 2" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {NSLog(@"Action 2 selected");}];UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"事件 3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {NSLog(@"Action 3 selected");}];UIPreviewAction *tap1 = [UIPreviewAction actionWithTitle:@"按钮 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {NSLog(@"tap 1 selected");}];UIPreviewAction *tap2 = [UIPreviewAction actionWithTitle:@"按钮 2" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {NSLog(@"tap 2 selected");}];UIPreviewAction *tap3 = [UIPreviewAction actionWithTitle:@"按钮 3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {NSLog(@"tap 3 selected");}];NSArray *actions = @[action1, action2, action3];NSArray *taps = @[tap1, tap2, tap3];UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"一组事件" style:UIPreviewActionStyleDefault actions:actions];UIPreviewActionGroup *group2 = [UIPreviewActionGroup actionGroupWithTitle:@"一组按钮" style:UIPreviewActionStyleDefault actions:taps];NSArray *group = @[group1,group2];//当然你也可以返回三个单独的action对象的数组,而不是group,具体效果,可以自己试一下return group;
}

二、运行效果与文件截图

1、运行效果截图:

2、文件截图:

三、其他补充

界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行!

注:本文著作权归作者,由demo大师(http://www.demodashi.com)宣传,拒绝转载,转载需要作者授权

3DTouch - iOS新特性相关推荐

  1. iOS 新特性分列式 之 iOS 9.x - 主要内容:苹果笔 API 引入、3D Touch、iPad 多任务加强、应用瘦身、应用传输安全、Swift 加强

    iOS 新特性分列式 之 iOS 9.x - 主要内容:苹果笔 API 引入.3D Touch.iPad 多任务加强.应用瘦身.应用传输安全.Swift 加强 太阳火神的美丽人生 (http://bl ...

  2. iOS 新特性分列式 之 iOS 8.x - 主要内容:应用扩展、手动对焦、Size Class

    iOS 新特性分列式 之 iOS 8.x - 主要内容:应用扩展.手动对焦.Size Class 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循&quo ...

  3. iOS 新特性实现 3DTouch 开发

    好久没有写过文章了,今天就给大家带来一篇比较简单的开发教程吧!目的是为了让大伙能够避开那些不必要的坑,快速高效的实现功能.今天呢来和大家讲一下iOS9的新特性3DTouch开发(iOS10都已经出了B ...

  4. iOS新特性框架、仿微信图片浏览、视频监控、爱心动画、文字适配等源码

    iOS精选源码 iOS一个看电影.电视剧集合 HDCinema 一个非常简易的新特性集成框架NewFeatures 全自动化的文字适配 仿微信朋友圈图片浏览器 iOS你的爱心❤️动画源码 一个类似系统 ...

  5. (0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标

    iOS新特性: iOS10.3教你如何动态更换APP图标? 1.iOS 10.3 开放了更换 app 图标的 API,核心方法是下面这个: [[UIApplication sharedApplicat ...

  6. 移动开发新指南:iOS6新特性…

    很不错的总结 原文地址:移动开发新指南:iOS6新特性完全解析作者:xakzhong WWDC的英文全称是"Worldwide Developers Conference",即为苹 ...

  7. 关于ios6的一些新特性

    WWDC的英文全称是"Worldwide Developers Conference",即为苹果全球开发者大会.每年定期由苹果公司(Apple Inc.)举办,大会在美国加州举行. ...

  8. iOS -- iOS11新特性,如何适配iOS11

    前言 这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配.本文作为一个总结. 本文内容包括:集成了搜索的大标题栏.横向选项卡栏.Ma ...

  9. iOS 9应用开发教程之iOS 9新特性

    iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统.该操作系统于2015年6月8号(美国时间)被发布.本章将主要讲解iOS ...

最新文章

  1. 更改centos 5 yum源
  2. linux shell less 命令---转
  3. C:输入数字计数(数组方法)
  4. 机器学习实践:TensorFlow2 多GPU负载不均衡问题
  5. c++静态成员变量成员函数
  6. Keil4编译原子哥的SYSTEM出现错误 Inline assembler not permitted when generating Thumb code
  7. C++ 解决enum redeclaration的冲突
  8. 协方差矩阵, 相关系数矩阵
  9. 前端学习(2474):页面布局
  10. java c s 比 c c s_Java技术学习笔记:C/S 与B/S 区别
  11. 今天来谈一谈环境对我们的习惯有什么影响
  12. 兴义智力象机器人_中科院科普讲师专家赴黔西南州做科普报告巡讲
  13. 有关南怀瑾、朱熹周易断卦法的个人观点
  14. python plc fx5u_三菱FX5U可编程控制器硬件及指令篇
  15. Python 量化分析——基本面选股模型
  16. PNP型三极管与NPN型三极管区别
  17. Screaming Frog Log File Analyser 中文版安装教程
  18. 虚拟pdn服务器,【转载】EPS中的PDN连接
  19. 计算机英语和普通英语区别表现,浅谈日常英语与计算机专业英语的区别
  20. IC芯片设计项目管理002:标准化流程的应用

热门文章

  1. table中加表单元素怎么验证_使用element-ui +Vue 解决 table 里包含表单验证的问题...
  2. Python入门级3-字典 if while for
  3. Monocular slam 的理论基础(1)
  4. 计算机中记录的意思,电脑日志看不懂,怎么才能知道日志记录的是什么意思啊?...
  5. i - 数据结构实验之图论九:最小生成树_「核心考点」2021计算机数据结构
  6. 【LeetCode】剑指 Offer 44. 数字序列中某一位的数字
  7. 【Spring】IOC
  8. Windows平台下搭建Git服务器
  9. 在著名出版社出版书,你也行——记录我写书出版的经历和体会
  10. Leetcode刷题记录[java]——561 Array Partition I