3D Touch详细实例介绍之一
来源:互联网 发布:免费的网络验证 编辑:程序博客网 时间:2024/05/17 03:27
*关于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时的标签参数。
参数详情:
2、Peek & Pop
这个是我非常喜欢的功能,结合其他技术,我们可以实现很diao的交互体验。
先上一个效果图吧
上滑~
下面以我的demo(使用SFSafariViewController预览当前链接)说一下从0开始怎么添加Peek & Pop到工程中:
- 在一个已存在的控制器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,不局限于SFSafariViewController let mains = UIStoryboard(name: "Main", bundle: nil) let pre = mains.instantiateViewControllerWithIdentifier("preVC") */ // 预览VC的大小 pre.preferredContentSize = CGSizeMake(0, 670) // 设置peek后的非模糊部分view的frame let 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) { // 关闭SFViewController controller .dismissViewControllerAnimated(true) { () -> Void in } }}
- 新建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 } // 创建多个action let 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详细实例介绍之一
- 3D Touch详细实例介绍之二
- iOS 3D Touch超详细入门介绍(附带demo示例代码)
- iOS 3D Touch开发介绍
- 3D Touch开发初体验-初学详细操作说明
- iOS开发--3D Touch使用代码实例
- 关于3D Touch
- 关于3D Touch
- 3D Touch初探
- 3D Touch大法
- 3D Touch
- ios 3D Touch
- 3D touch
- 3D Touch
- 3D Touch
- iphone 3D Touch
- 3D Touch入门
- 3D Touch APIs
- Java程序员可能犯的3个常见SQL错误
- POJ 1222 Java: Extended lights out 枚举
- iOS应用层架构之CDD
- Android如何防止apk程序被反编译
- Android--自定义tab+viewPager
- 3D Touch详细实例介绍之一
- Android的webview加载本地html、本apk内html和远程URL
- Java程序员应该掌握哪些东西?
- 初学Redis——用Redis作为Mysql数据库的缓存 (3)
- iOS绘图教程
- iOS开发里的线程安全机制
- 最少编码原则
- Effective Java读书笔记(九)
- 安装mongodb