3DTouch - iOS新特性
概述
详细
代码下载: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新特性相关推荐
- iOS 新特性分列式 之 iOS 9.x - 主要内容:苹果笔 API 引入、3D Touch、iPad 多任务加强、应用瘦身、应用传输安全、Swift 加强
iOS 新特性分列式 之 iOS 9.x - 主要内容:苹果笔 API 引入.3D Touch.iPad 多任务加强.应用瘦身.应用传输安全.Swift 加强 太阳火神的美丽人生 (http://bl ...
- iOS 新特性分列式 之 iOS 8.x - 主要内容:应用扩展、手动对焦、Size Class
iOS 新特性分列式 之 iOS 8.x - 主要内容:应用扩展.手动对焦.Size Class 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循&quo ...
- iOS 新特性实现 3DTouch 开发
好久没有写过文章了,今天就给大家带来一篇比较简单的开发教程吧!目的是为了让大伙能够避开那些不必要的坑,快速高效的实现功能.今天呢来和大家讲一下iOS9的新特性3DTouch开发(iOS10都已经出了B ...
- iOS新特性框架、仿微信图片浏览、视频监控、爱心动画、文字适配等源码
iOS精选源码 iOS一个看电影.电视剧集合 HDCinema 一个非常简易的新特性集成框架NewFeatures 全自动化的文字适配 仿微信朋友圈图片浏览器 iOS你的爱心❤️动画源码 一个类似系统 ...
- (0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标
iOS新特性: iOS10.3教你如何动态更换APP图标? 1.iOS 10.3 开放了更换 app 图标的 API,核心方法是下面这个: [[UIApplication sharedApplicat ...
- 移动开发新指南:iOS6新特性…
很不错的总结 原文地址:移动开发新指南:iOS6新特性完全解析作者:xakzhong WWDC的英文全称是"Worldwide Developers Conference",即为苹 ...
- 关于ios6的一些新特性
WWDC的英文全称是"Worldwide Developers Conference",即为苹果全球开发者大会.每年定期由苹果公司(Apple Inc.)举办,大会在美国加州举行. ...
- iOS -- iOS11新特性,如何适配iOS11
前言 这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配.本文作为一个总结. 本文内容包括:集成了搜索的大标题栏.横向选项卡栏.Ma ...
- iOS 9应用开发教程之iOS 9新特性
iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统.该操作系统于2015年6月8号(美国时间)被发布.本章将主要讲解iOS ...
最新文章
- 更改centos 5 yum源
- linux shell less 命令---转
- C:输入数字计数(数组方法)
- 机器学习实践:TensorFlow2 多GPU负载不均衡问题
- c++静态成员变量成员函数
- Keil4编译原子哥的SYSTEM出现错误 Inline assembler not permitted when generating Thumb code
- C++ 解决enum redeclaration的冲突
- 协方差矩阵, 相关系数矩阵
- 前端学习(2474):页面布局
- java c s 比 c c s_Java技术学习笔记:C/S 与B/S 区别
- 今天来谈一谈环境对我们的习惯有什么影响
- 兴义智力象机器人_中科院科普讲师专家赴黔西南州做科普报告巡讲
- 有关南怀瑾、朱熹周易断卦法的个人观点
- python plc fx5u_三菱FX5U可编程控制器硬件及指令篇
- Python 量化分析——基本面选股模型
- PNP型三极管与NPN型三极管区别
- Screaming Frog Log File Analyser 中文版安装教程
- 虚拟pdn服务器,【转载】EPS中的PDN连接
- 计算机英语和普通英语区别表现,浅谈日常英语与计算机专业英语的区别
- IC芯片设计项目管理002:标准化流程的应用
热门文章
- table中加表单元素怎么验证_使用element-ui +Vue 解决 table 里包含表单验证的问题...
- Python入门级3-字典 if while for
- Monocular slam 的理论基础(1)
- 计算机中记录的意思,电脑日志看不懂,怎么才能知道日志记录的是什么意思啊?...
- i - 数据结构实验之图论九:最小生成树_「核心考点」2021计算机数据结构
- 【LeetCode】剑指 Offer 44. 数字序列中某一位的数字
- 【Spring】IOC
- Windows平台下搭建Git服务器
- 在著名出版社出版书,你也行——记录我写书出版的经历和体会
- Leetcode刷题记录[java]——561 Array Partition I