3DTouch尝鲜
随着IOS9和iphone6S的推出,苹果新提供了3D Touch功能,让以往平面的操作,扩展到了3维.
让我们对应用的操作增加了新的方式.
目前最常用的3DTouch方式就是快捷菜单已经内容浏览了.于是我也把我练手的一个知乎日报
的DEMO程序增加上了3DTouch.
由于在xcode的模拟器上是没有办法模拟出3DTouch的操作,因此如果想在模拟器上开发这个功能的话,需要参考github上的一位大神的解决方案,当然这种方案只能模拟快捷菜单,其他的3DTouch的操作是没法模拟的,最好的方式还是去买一个iphone6S.
快捷菜单
所谓的快捷菜单就是 在应用的图标上重按,然后会出现几个快捷项.直接点击这些菜单项就可以执行某些操作.
UI设置
要实现这些个快捷菜单就需要在程序启动或配置info.plist程序的时候给程序增加上UIMutableApplicationShortcutItem
.
这个其实就是UIApplicationShortcutItem
的一个子类.UIApplicationShortcutItem
就是IOS用来表示快捷菜单的类,并且一个程序最多只能有4个快捷菜单项.
他有几个重要的属性:
- UIApplicationShortcutItemType,事件的唯一标识,用来表示你到底点击了哪个操作
- UIApplicationShortcutItemTitle,标题,在没有子标题的情况下可以自动换行
- UIApplicationShortcutItemSubtitle,子标题,在标题下方较小字体显示
- UIApplicationShortcutItemIconType,枚举选取系统中的一个图标
- UIApplicationShortcutItemIconFile,自定义一个图标文件,以单色35*35的大小展示
- UIApplicationShortcutItemUserInfo,自定义字典,可以放入自定义的属性.
因此,要给我的程序增加最新日报
每日瞎扯
的话,就需要这样操作:
- info.plist配置方式:
|
|
- 编程方式:
|
|
事件处理
UI解决了后,接下来需要做的就是处理快捷菜单的事件了.
在IOS9
中UIApplication
增加了一个回调方法:
|
|
当接收到快捷菜单的点击后,会调用这个方法.因此我们的事件处理就可以放到这里面:
|
|
需要注意的是completionHandler
在API中说明如果我们的应用程序不在后台而是重新启动的时候,应该设置为false,并且这时的回调是:
|
|
因此我们还需要再在didFinishLaunchingWithOptions
中增加相应的逻辑:
|
|
也就是我们可以从启动的launchOptions
获取key
为UIApplicationLaunchOptionsShortcutItemKey
的项,如果没有就说明不是3DTouch启动的,否则就是点击某一个快捷菜单
启动的.
当这两个地方都处理了后, 3DTouch的快捷菜单功能就算是完成了.
内容预览
3DTouch在应用中还有一个常用的功能,就是内容预览.通过轻按(peek)和重按(pop)来进行一系列的操作.
首先需要的是判断3DTouch是否在这个Controller上开启,决定这个的是UIForceTouchCapability
:
- UIForceTouchCapabilityUnknown //3D Touch检测失败
- UIForceTouchCapabilityUnavailable //3D Touch不可用
- UIForceTouchCapabilityAvailable //3D Touch可用
所以在程序中我们可以这样写:
|
|
当我们想给某一个controller增加内容预览功能的时候,就需要给这个controller实现UIViewControllerPreviewingDelegate
协议.
这个协议有两个方法,分别是peek
操作时触发以及pop
操作触发:
|
|
那么轻按预览的逻辑就很好处理了.
在public func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
这个方法中,根据location
找到轻按的内容项是哪一个,然后在程序中找到对应的详细内容.然后构造一个UIViewController进行返回.
|
|
在我的程序中就是找到轻按的新闻列表行.然后找到具体是哪一篇新闻,然后从storyBoard
中获取出新闻详细的ViewController.然后传入新闻详细的参数,最后返回. 这样就完成了轻按显示详细的目的.
而重案的话就更好处理了,在方法public func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController)
中的viewControllerToCommit
表示的就是你轻按激活的预览View.如果你想直接放大显示这个View的话,就直接调用self.showViewController(viewControllerToCommit, sender: self)
即可.比如我程序中的:
|
|
当然,你还可以增加些其他的操作.
更高级的操作比如内容预览上的Action等,等我后面增加到我的程序中后再来补充.