3D Touch大法
Demo同步更新到Swift2.3
本文出自: http://mokai.me/2016/09/3d-touch/
3D Touch最先应用在Apple Watch上面,但叫Force Touch
,后在iPhone6s上加入了此特性,并改名3D Touch。值得注意的是目前3D Touch只支持iPhone6S以后的机型,包括现有Xcode7中6s的模拟器也不支持,不过Github上的SBShortcutMenuSimulator项目通过Hack方式已经实现了Quick Actions
快捷访问,但不能使用Peek&Pop
快速预览。
如果你还不知道3D Touch是什么,可以看看官方宣传视频
环境
系统环境: iOS9 or later
开发环境: Swift2.3 & Xcode7.3.1
Demo: 3DTouchDemo
效果:
开始
3D Touch可以分为三种:
- Quick Actions【可以理解PC桌面的快捷方式】
- Peek&Pop【应用内快速预览内容】
- UITouch【自定义3D Touch事件】
Quick Actions 快捷方式
配置Actions可以通过工程Info.plist
文件静态配置,也可以在运行时动态添加,两者可以一起使用。
静态配置在Info.plist
中UIApplicationShortcutItems
节点数组下添加相应Actions Item信息
<key>UIApplicationShortcutItems</key>
<array><dict><key>UIApplicationShortcutItemIconType</key><string>UIApplicationShortcutIconTypeSearch</string><key>UIApplicationShortcutItemTitle</key><string>搜索</string><key>UIApplicationShortcutItemType</key><string>me.mokai.TouchDemo.action.search</string></dict>...
</array>
动态配置通过UIApplication的shortcutItems
添加,shortcutItems是一个UIApplicationShortcutItem
数组
let type = "me.mokai.TouchDemo.action.identify"
let title = "听歌识别"
let shortcutItem = UIApplicationShortcutItem(type: type, localizedTitle: title,localizedSubtitle: nil, icon: UIApplicationShortcutIcon(templateImageName: "quick_filter"), userInfo: nil)
application.shortcutItems = [shortcutItem]
Note
- Actions的图标可以使用系统预定的也可以自定义图片
- 对于每个Actions来说
type
是必须的,它代表着我们从桌面点击Actions进入到应用调用application(application, performActionForShortcutItem:, completionHandler:)
时的唯一标识,另外userInfo可以附加每个actions的数据,如最近听歌的歌曲id - 当APP启动时,shortcutItems的值是上次动态添加的,如果是第一次启动则为空数组。
- Actions最多显示4个,优先显示静态Actions,然后剩余个数显示shortcutItems的前几个。
Peek&POP 快速预览
好了,下面介绍本文重头戏,先上效果
Peek窗口的内容其实是目标VC【ps即将要显示的ViewController】的一个实时快照,但它不可以点击。Peek触发阶段有三种:
- 长按【显示一个焦点视图,触发Peek的源视图高亮,其它视图都处于模糊状态】
- 轻压【显示Peek窗口,此时如果Peek窗口支持Quick Actions,往上滑会显示Quick Actions菜单,此时的Peek窗口是不可以点击的】
- 重压 【进入到真正的ViewController】
Peek由一个可响应事件的View
触发,默认是关闭的,我们需要通过控制器的registerForPreviewingWithDelegate: sourceView:
方法注册,第一个参数为UIViewControllerPreviewingDelegate
的代理,Peek触发轻压时会调用其previewingContext:viewControllerForLocation
方法,重压时会调用previewingContext:commitViewController:
方法。第二个参数为触发Peek事件的源视图
//注册
registerForPreviewingWithDelegate(self, sourceView: userVCBtn)
//Delegate
//轻压,进入第二阶段,显示Peek窗口
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {let userVc = self.storyboard?.instantiateViewControllerWithIdentifier("UserViewController") as! UserViewControllerreturn userVc;
}
//重压,进入第三阶段,显示真正的ViewController
func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {showViewController(viewControllerToCommit, sender: self)
}
如果Peek窗口需要Quick Actions菜单,在目标VC中重写previewActionItems
方法返回一个UIPreviewActionItem
或者一个UIPreviewActionGroup
数组就行了。
//目标VC
lazy var previewActions: [UIPreviewActionItem] = {func previewActionForTitle(title: String, style: UIPreviewActionStyle = .Default) -> UIPreviewAction {return UIPreviewAction(title: title, style: style) { previewAction, viewController inprint("点击了\(title)") //这里是Actions响应}}let action1 = previewActionForTitle("关注TA",style: .Destructive) //显示红色,代表重要Actionlet action2 = previewActionForTitle("私信TA")//子Actioonslet subAction1 = previewActionForTitle("微博")let subAction2 = previewActionForTitle("好友圈")let subAction3 = previewActionForTitle("QQ")let subAction4 = previewActionForTitle("微信")let groupedActions = UIPreviewActionGroup(title: "分享…", style: .Default, actions: [subAction1, subAction2, subAction3, subAction4] )return [action1, action2, groupedActions]
}()
override func previewActionItems() -> [UIPreviewActionItem] {return previewActions
}
更快速的方法
上面是代码激活Peek的方式,还有更Peek的方式:直接在Storyboard中使用Segue,在Segue属性面板中把Peek & Pop 勾选上就完事了。
使用这种方式指定我们在代码中连注册都不用,所以使用SB的项目适配3D Touch那是分分钟搞定的事,尤其在Xcode7出了Storyboard References
后,我大 Swift + Storyboard
组合势必统一iOS界~
好了,有点小激动了,继续回到正文
在正常情况下,Peek窗口默认显示目标VC的整个View,但在实际应用中,可能会有更多的需求,比如说二个Button Push的是同一个VC,但是需要分别显示不同的Peek窗口。
其实也很简单,我们只需要自定义一个Peek的生命周期扩展就行了,previewingContext:viewControllerForLocation:
方法中代表Peek的开始,previewingContext:commitViewController
代表Peek的结束,然后在目标VC中重写二个方法就行了
//UIViewController+PeekCycle.swift
/**Peek生命周期
**/
extension UIViewController {//开始peek,VC为Peek显示做初始化func beginPeek(){}//结束peek,VC为真正显示做初始化func endPeek(){}
}
//Delegate
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {let detailVc = self.storyboard?.instantiateViewControllerWithIdentifier("DetailViewController") as! DetailViewController//指定Peek窗口类型detailVc.peekType = .Image//设置Peek的高度detailVc.preferredContentSize = CGSize(width: 0.0, height: 320);detailVc.view //先访问一下view,初始化detailVc.beginPeek() //peek开始return detailVc;
}
func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {viewControllerToCommit.endPeek() //peek结束showViewController(viewControllerToCommit, sender: self)
}
//目标VC
override func beginPeek() { if(peekType == .Comments){ //如果是评论则只显示评论视图imageView.hidden = true}else{ //否则显示图片commentsView.hidden = true}
}
override func endPeek() {if(peekType == .Comments){imageView.hidden = false}else{commentsView.hidden = false}
}
Note
- 如果要改变Peek窗口的size可以设置目标VC的
preferredContentSize
- 对于直接使用
registerForPreviewingWithDelegate
注册VC的self.view,虽然可以自动注册subviews,但是如果说你的VC中不止一种视图要触发Peek,那么它会分分钟教你做人的道理。
UITouch
高级玩法,绘图、游戏,把3D Touch发挥到极致。不过我也唔知玩也暂时没这方面需求,有需求看官方绘图demo
参考
Adopting 3D Touch on iPhone
ApplicationShortcuts Demo
ViewControllerPreviews Demo
小小广告
本人目前是一名自由职业者,接受移动两端的项目开发,如果你有需求或者有资源请速与我联系吧,QQ865425695
3D Touch大法相关推荐
- 3D Touch介绍: 一个数字压力器App和Quick Actions
随着iPhone 6s and 6s Plus的发布,苹果介绍了全新的手机交互方式:重按手势.你应该知道,这个特性其实早已应用在苹果手表和MacBook产品中,名字叫Force Touch.它给用户交 ...
- 3d触控怎么测试软件,如何检测iPhone 8的3D Touch灵敏度
近日有消息报道,凯基证券旗下分析师郭明錤早前曾经预测,今年苹果会推出三款不同尺寸的新 iPhone,其中 4.7 和 5.5 英寸型号是 iPhone 7 和 iPhone 7 Plus 的增强版,而 ...
- 苹果6s解除耳机模式_出大问题!苹果或将砍掉3D Touch?
戳我丨来回团队大曝光! 福利丨来回科技首家体验店! 揭秘丨来回科技质检/发货流程! 戳我丨来回科技是如何亏了1个亿? 手机上哪些是你用了就回不去的功能?全面屏,快充,红外,NFC还是3.5mm耳机孔? ...
- iOS 9之3D Touch
金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...
- 告别3D Touch 2019款iPhone手机或将拿掉屏幕压感功能
有消息称,2019新款iPhone手机将正式取消3D Touch屏幕压感功能.其实,早在今年1月,就有类似消息曝出.而全新升级的iOS 13测试版中也间接验证了这一说法. 在目前的iOS 13测试版中 ...
- 美团推出外卖版拼多多;iOS 14 Beta 3暂禁用3D Touch功能;Rust 1.45 发布| 极客头条
整理 | 屠敏 头图 | CSDN 下载自东方 IC 扫描二维码,即刻收听 极客头条音频版 智能播报由出门问问「魔音工坊」提供技术支持 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上 ...
- Android 设备上可以实现 3D Touch 吗?| 原力计划
作者 | Android_zhu_jiang 责编 | 屠敏 出品 | CSDN 博客 苹果在iPhone 6s和iPhone 6s Plus开始新增了3D Touch,这个功能褒贬不一,但我觉得还是 ...
- iPhone 或将告别 3D Touch ?
作者 | 屠敏 出品 | CSDN(ID:CSDNnews) 生于创新,死于无用. 或许这句话说的太过绝对,但是用在 3D Touch 这项技术身上似乎又毫不为过,当然其中的"无用" ...
- ios touch坐标_iOS 3D Touch –窥视与流行
ios touch坐标 In this tutorial, we'll be discussing and implementing the 3D Touch functionality in our ...
最新文章
- Linux 文件系统及 ext2 文件系统
- 考研成绩查询系统(jsp、mysql、java)
- python语言解释器的全部代码都是开源的_Python IDE和解释器的区别是什么?
- 潘天佑博士2014微软学生夏令营演讲:如何培养领导力
- Mybatis入门学习---创建第一个Mybatis程序
- percona toolkit for mysql_Percona Toolkit for MySQL安装(CentOS5.8) | 学步园
- IDEA 创建 SpringCloud项目-多项目方式
- VMware和NVIDIA推出新一代混合云架构
- Linux里面nginx显示Hello,Nginx得知——Hello World模
- 《变革中的思索》连载九:放飞的爱——母亲和我
- 将软件添加到右键菜单 最简单的方法
- java nlpir_1---------java调用NLPIR(ICTCLAS2016)实现分词功能
- hspice for linux的命令行
- java代码楼房销售管理系统_secondHouse2 java二手房交易管理系统,针对房地产楼房销售的 Develop 272万源代码下载- www.pudn.com...
- 文件在计算机系统储存具体位置,电脑微信的文件储存位置怎么打开
- html5两个标签重叠,css中两个盒子如何重叠?
- 立创eda学习笔记二十二:如何修改pcb网络颜色?
- 简单灵活万用管理软件——蓝点通用管理系统V26破版,手慢无
- Idea在Maven项目中使用支付宝沙箱环境
- SMART PLC如何修改运动控制向导生成的点动速度(JOG_SPEED)
热门文章
- 初学 博弈论 又称对策论 Game Theory
- 日语语法(四):形容词
- NUnit2.0详细使用方法 选择自 cyp403 的 Blog
- 运行项目页面显示“该网页无法正常运作”的解决办法 - 前端篇
- 基于微前端qiankun的多页签缓存方案实践
- 全国计算机考试等级考务管理系统,全国计算机等级考试考务管理系统:https://ncre-bm.neea.edu.cn/...
- 斜杠 反斜杠 双斜杠 双反斜杠
- 小米6刷Android10以及Xposed
- EasyExcel删除模版Sheet页
- ozip解密_【ozip转换解包】ROM制作工具已适配机型列表,全网最全!