3D touch介绍
3D touch 是ios9+、iphone6s+的新功能,简单的说3Dtouch就是用力按压,通过3Dtouch增加了一组手势交互方式。
3D touch主要常见的使用:
Home Screen Quick Actions (主屏快捷行为入口)
peek and pop (预览和弹出)
WebView peek and pop API (HTML链接预览功能)
Force Properties (按压力度)
使用
- 在 plist.info 文件加入UIApplicationShortcutItems 数组在其中定义 静态快速选项
- 使用 UIApplicationShortcutItem 类和相关的API来定义 动态快速选项 。使用新的 shortcutItems 属性将 动态快速选项 添加到你应用共享的 UIApplication 对象中。
// 创建标签的ICON图标。
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];
// 创建一个标签,并配置相关属性。
UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"two" localizedTitle:@"在么" localizedSubtitle:@"我爱你" icon:icon userInfo:nil];
// 将标签添加进Application的shortcutItems中。
[UIApplication sharedApplication].shortcutItems = @[item];
// 程序在后台运行,或者被激活,点击快捷菜单进来的页面
if ([shortcutItem.localizedTitle isEqualToString:@"在吗"]) {
NSLog(@"去洗澡");
} else if ([shortcutItem.localizedTitle isEqualToString:@"爱你"]) {
NSLog(@"呵呵");
}
};```
3.给控件加上 3DTouch 手势,按压预览
首先控制器该遵循UIViewControllerPreviewingDelegate应该判断该控制器当前是否实现了3dtouch手势
`if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"3D Touch 可用");
[self registerForPreviewingWithDelegate:(id)self sourceView:self.view];
} else {
NSLog(@"3D Touch 不可用,shit ,换手机吧");
}`
点击进入预览(peek)模式,实现协议方法
- (UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location;
继续按压进入,实现该方法,这里可自己添加跳转
- (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit;
预览模式上拉快捷操作菜单,需在被预览的控制器中实现
- (NSArray> *)previewActionItems,返回菜单数组。
UIPreviewAction *action = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"收藏成功");
}];
特殊说明,如果是模拟器,默认是不支持 3DTouch 的,但是机智的外国开发者研究出了在模拟器可以使用桌面快捷菜单的功能(长按打开),具体见https://github.com/DeskConnect/SBShortcutMenuSimulator
另外,在程序内时,也有开发者开发了模拟器使用长按功能呼出 peep 预览界面的功能(swift),具体见(https://github.com/marmelroy/PeekPop)