## 3D Touch开发全面教程之Peek and Pop - 预览和弹出

---

### 了解3D Touch

在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch技术。3D Touch的触控技术,被苹果称为新一代多点触控技术。系统只能支持iOS9+,硬件是iPhone6S+。

iOS9提供了四类API

1. Home Screen Quick Action : 对着Icon按压,弹出快捷菜单
2. Peek & Pop : 对着APP内容按压,会弹出内容预览和快捷菜单
3. WebView Peek & Pop : 使用`SFSafariViewController`打开的网页内容自带Peek & Pop 效果
4. UITouch Force Properties : 检测用户按压力度

###

检测是否支持3D Touch:`UIForceTouchCapability `是一个枚举值,取值如下:

case unknown //3D Touch检测失败
case unavailable //3D Touch不可用
case available //3D Touch可用

在`UIViewController`中`traitCollection`属性中,可以间接获取到`UIForceTouchCapability `

if(self.traitCollection.forceTouchCapability == .available){
//TODO ...
}

### 代码实现

1. 显示peek视图

2. peek视图时手指上滑,唤出peek视图快速选项

##### 代码实现 1 - 显示peek视图

首先要控制器中注册代理

registerForPreviewingWithDelegate(self, sourceView: view)

然后实现代理`UIViewControllerPreviewingDelegate `的方法`func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?`

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

我们申明一个peek视图的控制器,也就是正常情况下点击UITableViewCell要跳转到的控制器,设置控制器内容和peek视图的大小,设置大小使用preferredContentSize 属性,如果为0的话则系统自动配置最佳大小

guard let indexPath = tableView.indexPathForRow(at: location) , let cell = tableView.cellForRow(at: indexPath) else {
return nil
}

let detailVc = DetailViewController()

detailVc.preferredContentSize = CGSize(width: 0, height: 0)
previewingContext.sourceRect = cell.frame
detailVc.mTitle = cell.textLabel?.text
return detailVc

}

##### 代码实现 2 - peek视图时手指上滑,唤出peek视图快速选项

要实现这个操作,需要在peek视图对应的控制器中重写previewActionItems方法

比如我这里重写后是这样的:

override var previewActionItems: [UIPreviewActionItem] {

let a1 = UIPreviewAction(title: "在新标签中打开", style: .default, handler: { (action, vc) in
print(action.title)
})
let a2 = UIPreviewAction(title: "加入阅读列表", style: .selected, handler: { (action, vc) in
print(action.title)
})
let a31 = UIPreviewAction(title: "拷贝", style: .default, handler: { (action, vc) in
print(action.title)
})
let a32 = UIPreviewAction(title: "收藏", style: .default, handler: { (action, vc) in
print(action.title)
})
let a3 = UIPreviewActionGroup(title: "共享&更多...", style: .default, actions: [a31,a32])

return [a1,a2,a3]
}

### Web view peek and pop API (HTML链接预览功能)
除了tableViewCell可以实现peek and pop, 原生的safari浏览器中的超链接可以支持3D touch,出现超链接的预览,使用方法和前文中提到的方法类似。

ios 9 中增加了一个新的浏览器控制器叫做 ` SFSafariViewController ` ,它可以在你的程序中直接嵌入 Safari浏览器,简单的写一段示例代码:

`import SafariServices`

let sasfarVc = SFSafariViewController(url: URL(string:"https://www.baidu.com"), entersReaderIfAvailable: true)
self.navigationController ?.pushViewController(sasfarVc, animated: true)

这样,我们就在app内嵌的Safari浏览器并且打开了baidu的页面,并且使用3d touch超链接也会有预览的效果了。

参考:

- [在iOS9中使用3D Touch](http://liuyanwei.jumppo.com/2016/04/01/iOS-3DTouch-2.html)
- [iOS 3D touch开发(二) peek and pop - 预览和弹出](http://liuyanwei.jumppo.com/2016/04/01/iOS-3DTouch-2.html)

3D Touch开发全面教程之Peek and Pop - 预览和弹出的更多相关文章

  1. 你想知道的3D Touch开发全在这里了

    前言 iPhone 6s和iPhone 6s Plus为多点触摸界面带来了强大的3D触摸新维度.这项新技术可以感知用户按下显示屏的深度,让他们比以往任何时候都更能使用你的应用程序和游戏.更多关于3D ...

  2. Peek和Pop功能开发(3D Touch开发之一)

    1.哪些设备支持3D Touch iPhone 6s/Plus.iPhone 7s/Plus.iPhone 8s/Plus.iPhone X (系统必须是iOS9或者更新的版本) 2.怎么实现Peek ...

  3. 3D Touch开发

    一.3d Touch 官方文档介绍 1.A user can now press your Home screen icon to immediately access functionality p ...

  4. 3D Touch开发技巧的笔记

    iPhone6s以及iPhone6s plus搭载iOS9,有一个新功能叫做3D Touch,这个功能有很大的用处,关键是要会用,这给交互方式又多了一个新的选择和思考,比如说游戏中的额外控制选项.绘图 ...

  5. [学习笔记]Javaweb开发视频教程之Tomcat9配置

    参考自北京动力节点的视频教程:https://www.bilibili.com/video/av14548279/?p=1 1.Java XE Java SE 是做电脑上运行的软件. Java EE ...

  6. 微信小程序,预览在开发工具上显示正常,手机预览二维码报request->fail错误,打开手机的调试功能又正常。

    这里错误很明显是属于网址错误,开发工具和手机调试都能走request->success: 唯独常规模式下无法显示. 最开始调试过很多方法,没找出原因.最后到小程序开发设置才发现,自己未配置服务器 ...

  7. ipad iphone 开发的应用,加一个启动预览图片

    如果你想在你的ipad,iphone应用启动是不显示黑屏幕,而是用一个图片代替的话,你只需要吧一张名为 Default.png 的图片加到项目里就行了. 很简单吧,新手们记得去这样美化下你的应用吗,很 ...

  8. 【转】 教你如何创建类似QQ的android弹出菜单

    原文地址:http://www.apkbus.com/android-18034-1-1.html 大家可能看到android的自带的系统菜单比较难看,如图: 2011-12-4 23:13 上传 下 ...

  9. 教你一招:解决Windows 开机弹出AotuIt ERROR 错误

    AutoIt是个脚本语言,常被用于自动化安装.网络上有些系统镜像里含有AutoIt脚本,用于系统的自动配置.出现这种问题往往有两种可能的原因: 1)做系统的时候没搞好.这种情况就需要换一个镜像文件. ...

随机推荐

  1. [osg]osg显示中文信息

    转自:http://www.cnblogs.com/feixiang-peng/articles/3152754.html 写好了在osg中实时显示中文信息的效果.中间遇到两个问题,一个是中文显示,一 ...

  2. EntityFrameWork分页

    EF分页代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  3. Intent的概念及应用(二)

    ------siwuxie095 1.Intent过滤器 intent-filter 相关选项 如果多个Activity拥有同样的action,在启动时这个action时的情况: 首先在LearnIn ...

  4. jquery中html()或text()方法获取或设置p标签的值

    html()方法可以用来读取或者设置某个元素中的HTML内容,text()方法可以用来读取或者没置某个元素中的文本内容 html()方法 此方法类似于JavaScript中的innerHTML属性,可 ...

  5. 让VLC也拥有斷點播放功能

    如何让VLC也拥有记忆功能,记住上次播放位置.以下都是在Windows系统下操作,其他 方法/步骤 下载 libsrpos_plugin-0.5.win 插件 https://sourceforge. ...

  6. docker tag

    docker tag 命令以及其中的一些概念--之我见 1.  重要的本质的东西是 image - docker 最有用的东西是image,这个应该可以被大部分人接受 - 查看官网的 tag 命令,一 ...

  7. 2015年15+最佳的响应式HTML5网站模板

    015年最好的免费响应式HTML5模板通常用于创建新潮的网站. HTML5是HTML用于创建现代化网站的最新版本.随着这一现代标记语言的出现,网上冲浪的趋势变得越来越智能化越来越酷.几乎每个web开发 ...

  8. Frameset使用教程

    frame,是网页开发必须掌握的知识.例如后台架构.局部刷新,页面分割,都是frame的用途表现,尤其是后台页面制作,使用frame会给用户带来非常舒适的使用感受. frame知识点包括(frames ...

  9. Windows API 函数浏览

    AbortDoc                                          终止一项打印作业                        是         是        ...

  10. 在web前端使用SVG

    前言: 花了些时间了解了一下svg,然而仍然不怎么了解... 第一步:直接在html代码中使用svg. 首先了解几个标签: <svg version="1.1" xmlns= ...