*关于3D Touch,目前能用的就是三处,
1、Home Screen Quick Actions,
就是 应用图标压力感应,弹出的菜单,这个是简单的应用场景,下面稍作介绍;
2、UIKit peek and pop & Web view peek and pop,
指的是在App内部,压力感应的预览功能,这两个我归为一类,是因为大同小异,都是预览,只是UIKit预览,要我们自定义一个预览VC,而Web view预览,使用SFSafariViewController,只需要打开webView的allowsLinkPreview属性,具体我将UIKit peek & pop写到一个demo中,大家可以到github地址参考:https://github.com/jakajacky/3DTouch-SFSafariViewController*
3、Force Properties,
结合UITouch的自定义压力感应需求的属性,这个打算有空先写个demo,然后在之后的博客中写写。。。这里不提了
下面进入正题:

1、Home Screen Quick Actions

1、静态添加入口标签
在plist文件中添加如图字段

这个大家自己YY吧
2、动态添加入口标签
我们在工程中根视图的viewDidLoad方法中添加如下代码:

// 创建标签的ICON图标。//如果系统图标不满足需求,可以使用+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;添加自定义图片作为标签,需要注意的是:图片必须预先添加进bundle。
let addIcon   = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Add)let alarmIcon = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Alarm)let cloudIcon = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Cloud)let bookMIcon = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Bookmark)
// 创建一个标签,并配置相关属性。
let addItem = UIApplicationShortcutItem
(type: "a", localizedTitle: "添加", localizedSubtitle: "", icon: addIcon, userInfo: nil)let alarmItem = UIApplicationShortcutItem(type: "b", localizedTitle: "闹钟", localizedSubtitle: "", icon: alarmIcon, userInfo: nil)
(type: "c", localizedTitle: "cloud", localizedSubtitle: "", icon: cloudIcon, userInfo: nil)let booMItem = UIApplicationShortcutItem(type: "d", localizedTitle: "书签", localizedSubtitle: "", icon: bookMIcon, userInfo: nil)
// 将标签添加进Application的shortcutItems中。
UIApplication.sharedApplication().shortcutItems = [addItem, alarmItem, cloudItem, booMItem];

效果图:

我们知道,这个功能的作用就是用来快速启动App中某一个特定功能,EX: 扫一扫,那么如何判断点击类型来确定App入口呢?

iOS9在AppDelegated中提供了一个新方法:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {// performActionForShortcutItem作为入口标记
}

如果App是从快速入口启动的,则会执行这个方法。该方法的shortcutItem参数携带了从快速入口进入app时的标签参数。

参数详情:

字段名 功能 备注
UIApplicationShortcutIemType 设置快捷item的类型 可以根据此type判断不同的item,从而能判定入口
UIApplicationShortcutItemUserInfo 设置用户信息,是一个字典类型,可以用来传值 传值到对应的入口处
UIApplicationShortcutIcon 菜单图标 -
UIApplicationShortcutItem 菜单类 -

2、Peek & Pop

这个是我非常喜欢的功能,结合其他技术,我们可以实现很diao的交互体验。
先上一个效果图吧

上滑~

下面以我的demo(使用SFSafariViewController预览当前链接)说一下从0开始怎么添加Peek & Pop到工程中:

  1. 在一个已存在的控制器ViewController中,遵循 UIViewControllerPreviewingDelegate、SFSafariViewControllerDelegate,并实现代理方法
// 我习惯写在了extension中
extension ViewController: UIViewControllerPreviewingDelegate, SFSafariViewControllerDelegate{/**UIViewControllerPreviewingDelegate  peek & pop*/func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {// location:手指压力的位置,是一个很有用参数,比如设定压力响应有效范围、tableView中辨别cell// SFSafariViewController展示url内容的预览VC// SFViewController是我继承SFSafariViewController写的,目的是为了扩展Peek & Pop的UIPreviewAction功能(预览状态,上移VC,下方弹出类似ActionSheet框)let pre = SFViewController(URL: NSURL(string:constellEN == "" ? "http://www.xzw.com/astro/" : "http://www.xzw.com/astro/".stringByAppendingFormat(constellEN))!,entersReaderIfAvailable: true)pre.constellEN = "http://www.xzw.com/astro/".stringByAppendingFormat(constellEN)/* // 当然,根据不同需求,我们可以自定义预览VC,不局限于SFSafariViewControllerlet mains = UIStoryboard(name: "Main", bundle: nil)let pre = mains.instantiateViewControllerWithIdentifier("preVC")*/// 预览VC的大小pre.preferredContentSize = CGSizeMake(0, 670)// 设置peek后的非模糊部分view的framelet rect = CGRectMake(0, button.frame.origin.y, self.view.frame.size.width - 20, 50)previewingContext.sourceRect = rect// 固定3D Touch的有效感应范围return CGRectContainsPoint(button.frame, location) ? pre : nil}func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {self.showViewController(viewControllerToCommit, sender: self)}/**1.  SFSafariViewControllerDelegate  点击'Done' 关闭SFSafariViewController*/func safariViewControllerDidFinish(controller: SFSafariViewController) {// 关闭SFViewControllercontroller .dismissViewControllerAnimated(true) { () -> Void in   }}
}
  1. 新建SFViewController
class SFViewController: SFSafariViewController {var constellEN : String? = ""override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view.}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Dispose of any resources that can be recreated.}
// Preview action items.// 计算属性lazy var previewActions: [UIPreviewActionItem] = {// 创建UIPreViewAction的函数func previewActionForTitle(title: String, style: UIPreviewActionStyle = .Default) -> UIPreviewAction {let action = UIPreviewAction(title: title, style: style) { previewAction, viewController in// previewAction 是被点击的Action; viewController 就是预览的VC// 这个闭包内,可以写点击Action的响应事件guard let detailViewController = viewController as? SFViewController,item = detailViewController.constellEN else { return }if previewAction.title == "复制链接" {// 访问剪切板let pasteB = UIPasteboard.generalPasteboard()pasteB.string = item}}return action}// 创建多个actionlet action  = previewActionForTitle("分享")let action1 = previewActionForTitle("复制链接")let action2 = previewActionForTitle("Destructive Action", style: .Destructive)let subAction1 = previewActionForTitle("Sub Action 1")let subAction2 = previewActionForTitle("Sub Action 2")let groupedActions = UIPreviewActionGroup(title: "Sub Actions…", style: .Default, actions: [subAction1, subAction2] )return [action, action1, action2, groupedActions]}()// MARK: Preview actions// 重写previewActionItems(),将多个actions返回override func previewActionItems() -> [UIPreviewActionItem] {return previewActions}}

到这基本就实现了我们所说的Peek & Pop功能,具体细节,请到github下载:https://github.com/jakajacky/3DTouch-SFSafariViewController

关于Force Properties的细节,将在之后的文章中介绍,顺便看看做个关于压力的小东西,谢谢~

3D Touch详细实例介绍之一相关推荐

  1. word2vec的详细实例介绍(包含jieba分词提供的语料)

    原创实在不易,欢迎大家关注我微信公众号:阳洋up 重要参考博客:word2vec中文相似词计算和聚类的使用说明及c语言源码_杨秀璋的专栏-CSDN博客_word2vec词语相似度 https://ww ...

  2. mysql 事务操作详细实例介绍

    1.打开mysql 本人由于重装了系统之后,不能快速正确找到mysql客户端,所以需要使用cmd窗口来运行命令行程序. 如果在打开cmd窗口时就使用mysql命令,会出现如下错误: 这是由于没有目前还 ...

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

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

  4. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  5. 你知道安卓的3D Touch吗?(Shortcut详解,你想知道的我都有)

    前因后果 苹果在iPhone 6s和iPhone 6s Plus开始新增了3D Touch,这个功能褒贬不一,但我觉得还是特别好用的,特别是在微信上付款.加好友.扫二维码,或是在支付宝上付款等等场景. ...

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

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

  7. iOS技术总结1——3D Touch技术

    简介 3D Touch是iPhone 6s+,iOS9之后新增的功能.是一种立体触控技术,被苹果称为新一代多点触控技术,在Apple Watch上体现为采用了Force Touch,屏幕可感知不同的感 ...

  8. 苹果弃用 3D Touch!

    被称之为新一代多点触控技术的 3D Touch 为何频遭 iPhone 等产品嫌弃?本文将从用户体验角度分析这项技术失败的原因. 3D Touch 上个月,苹果公布了他们最成功的产品和品牌--iPho ...

  9. iOS9 3D Touch 标签菜单 peek and pop force 压力触控 功能开发高级版教程

    iOS9 3D Touch 标签菜单 peek and pop  force 压力触控 功能开发高级版教程 github地址: https://github.com/wyk125/3DTouchDem ...

  10. android-b9是什么设备,Android 设备上可以实现 3D Touch 吗?| 原力计划

    这么好用的功能安卓能不模仿吗?呸!能不实现吗? 从安卓7.1(25)开始,系统新增了Shortcut来实现类似{e6803e21b9c61f9ab3d04088638cecd2}3D Touch的功能 ...

最新文章

  1. numpy.array()基本操作
  2. 第0次作业——读推荐博客有感
  3. Kinect学习(一):开发环境搭建
  4. QTP之对测试用例的自动化过程的分解
  5. linux 提取cpio_使用rpm2cpio,cpio提取rpm包的中的特定文件
  6. html5,表格与框架综合布局
  7. 如何将10进制转成16进制,又如何将16进制数转成10进制,C#和VB代码?
  8. 基于粒子群优化算法的函数寻优算法
  9. Java实现第九届蓝桥杯分数
  10. 二元二次方程例题_二元二次方程组-解法-例题.
  11. js获取当前农历时间
  12. 计算机uc,UC浏览器
  13. 知识经济时代的基石:知识协同
  14. 大部分前端都在用的 ES6 代码简化技巧,你都在用吗?
  15. 做程序界中的死神,获取自己的灵力修养
  16. 商城小程序的一些功能介绍以及搭建教程
  17. 高中OJ3837. 【NOIP2014模拟9.14】心灵终结
  18. 【Android】带你细看Android input系统中ANR的机制
  19. CSS visibility
  20. 杰理之充电芯片选型【篇】

热门文章

  1. Java获取时间,将当前时间减一天、一月、一年,并加以格式化
  2. 日历 设置云端邮件服务器,ios设置MDaemon activesync同步邮件、联系人、日历
  3. 【读书有感】——你只是看起来很努力
  4. 如何写论文的introduction
  5. 狐狸逮兔子——链式存储方式
  6. Python爬虫入门教程 89-100 定个小目标,先用Python爬个一亿B站用户
  7. 显示接口DP HDMI VGA DVI LVDS的区别
  8. 电压电流的超前与滞后
  9. 【强化学习】DQN:Flappy Bird实例分析
  10. DeleteRow()