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.plistUIApplicationShortcutItems节点数组下添加相应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大法相关推荐

  1. 3D Touch介绍: 一个数字压力器App和Quick Actions

    随着iPhone 6s and 6s Plus的发布,苹果介绍了全新的手机交互方式:重按手势.你应该知道,这个特性其实早已应用在苹果手表和MacBook产品中,名字叫Force Touch.它给用户交 ...

  2. 3d触控怎么测试软件,如何检测iPhone 8的3D Touch灵敏度

    近日有消息报道,凯基证券旗下分析师郭明錤早前曾经预测,今年苹果会推出三款不同尺寸的新 iPhone,其中 4.7 和 5.5 英寸型号是 iPhone 7 和 iPhone 7 Plus 的增强版,而 ...

  3. 苹果6s解除耳机模式_出大问题!苹果或将砍掉3D Touch?

    戳我丨来回团队大曝光! 福利丨来回科技首家体验店! 揭秘丨来回科技质检/发货流程! 戳我丨来回科技是如何亏了1个亿? 手机上哪些是你用了就回不去的功能?全面屏,快充,红外,NFC还是3.5mm耳机孔? ...

  4. iOS 9之3D Touch

    金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...

  5. 告别3D Touch 2019款iPhone手机或将拿掉屏幕压感功能

    有消息称,2019新款iPhone手机将正式取消3D Touch屏幕压感功能.其实,早在今年1月,就有类似消息曝出.而全新升级的iOS 13测试版中也间接验证了这一说法. 在目前的iOS 13测试版中 ...

  6. 美团推出外卖版拼多多;iOS 14 Beta 3暂禁用3D Touch功能;Rust 1.45 发布| 极客头条

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 扫描二维码,即刻收听 极客头条音频版 智能播报由出门问问「魔音工坊」提供技术支持 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上 ...

  7. Android 设备上可以实现 3D Touch 吗?| 原力计划

    作者 | Android_zhu_jiang 责编 | 屠敏 出品 | CSDN 博客 苹果在iPhone 6s和iPhone 6s Plus开始新增了3D Touch,这个功能褒贬不一,但我觉得还是 ...

  8. iPhone 或将告别 3D Touch ?

    作者 | 屠敏 出品 | CSDN(ID:CSDNnews) 生于创新,死于无用. 或许这句话说的太过绝对,但是用在 3D Touch 这项技术身上似乎又毫不为过,当然其中的"无用" ...

  9. ios touch坐标_iOS 3D Touch –窥视与流行

    ios touch坐标 In this tutorial, we'll be discussing and implementing the 3D Touch functionality in our ...

最新文章

  1. Linux 文件系统及 ext2 文件系统
  2. 考研成绩查询系统(jsp、mysql、java)
  3. python语言解释器的全部代码都是开源的_Python IDE和解释器的区别是什么?
  4. 潘天佑博士2014微软学生夏令营演讲:如何培养领导力
  5. Mybatis入门学习---创建第一个Mybatis程序
  6. percona toolkit for mysql_Percona Toolkit for MySQL安装(CentOS5.8) | 学步园
  7. IDEA 创建 SpringCloud项目-多项目方式
  8. VMware和NVIDIA推出新一代混合云架构
  9. Linux里面nginx显示Hello,Nginx得知——Hello World模
  10. 《变革中的思索》连载九:放飞的爱——母亲和我
  11. 将软件添加到右键菜单 最简单的方法
  12. java nlpir_1---------java调用NLPIR(ICTCLAS2016)实现分词功能
  13. hspice for linux的命令行
  14. java代码楼房销售管理系统_secondHouse2 java二手房交易管理系统,针对房地产楼房销售的 Develop 272万源代码下载- www.pudn.com...
  15. 文件在计算机系统储存具体位置,电脑微信的文件储存位置怎么打开
  16. html5两个标签重叠,css中两个盒子如何重叠?
  17. 立创eda学习笔记二十二:如何修改pcb网络颜色?
  18. 简单灵活万用管理软件——蓝点通用管理系统V26破版,手慢无
  19. Idea在Maven项目中使用支付宝沙箱环境
  20. SMART PLC如何修改运动控制向导生成的点动速度(JOG_SPEED)

热门文章

  1. 初学 博弈论 又称对策论 Game Theory
  2. 日语语法(四):形容词
  3. NUnit2.0详细使用方法 选择自 cyp403 的 Blog
  4. 运行项目页面显示“该网页无法正常运作”的解决办法 - 前端篇
  5. 基于微前端qiankun的多页签缓存方案实践
  6. 全国计算机考试等级考务管理系统,全国计算机等级考试考务管理系统:https://ncre-bm.neea.edu.cn/...
  7. 斜杠 反斜杠  双斜杠 双反斜杠
  8. 小米6刷Android10以及Xposed
  9. EasyExcel删除模版Sheet页
  10. ozip解密_【ozip转换解包】ROM制作工具已适配机型列表,全网最全!