iOS9系列之-3D-touch

什么是3D Touch

iPhone 6s 推出了一种可以让你与手机进行互动的全新方式。这一次,iPhone 能够感应你按压屏幕的力度。除了轻点、轻扫、双指开合这些熟悉的 Multi‑Touch 手势之外,3D Touch 还带来 Peek 和 Pop,为 iPhone 的使用体验开拓出全新的维度。而且,当你使用 3D Touch 时,iPhone 将回以轻微的触感,让你不仅能够看到按下屏幕的操作效果,还能感觉得到。

这是苹果官网的官话,用我自己的意思理解就是,通过按压屏幕的的力度来进行不同的交互。

3D Touch的几种功能形态


  1. Home Screen Quick Actions
    通过应用的icon图标,使用3D touch进行重按,会呼出一个快捷菜单。通过这个菜单可以快速定位到应用中的某个界面。这是在我自己应用上写的一个小demo。
  2. peek and pop
    如果对应用内的某个视图进行按压。开始除了这个视图之外会变模糊,然后继续按压,可以弹出一个完整的视图。可以对这个视图进行上拉然后进行进一步交互

  3. UITouch force properties
    基于力度的交互,还没有深入了解。

更多详细的介绍可以看官网文档

模拟器使用3D touch


关于没有6s/6sp,又想在模拟器使用3d-touch的情况。已经有人开发出了相应的解决程序SBShortcutMenuSimulator。具体的安装方法在github里面已经很清楚了

创建与使用


  1. Home Screen Quick Actions
    通过home弹出来的那些小按钮叫做UIApplicationShortcutItem。创建方式有两种:
  • 动态创建
    通过代码来创建
1
2
3
4
5
6
7
8
9
// 通过初始化方法创建一个item
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
// 上面方法中的icon也有初始化方法
// 用系统的图标
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
// 自定义图标
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;
// 最后将创建的标签添加进Application的shortcutItems中。
[UIApplication sharedApplication].shortcutItems = @[item];
  • 静态创建
    通过plist文件来创建,需要的填的2个键值。可以通过这两个键值来判断点击了哪个来进行响应。
    UIApplicationShortcutItemType 快捷通道类型的字符串
    UIApplicationShortcutItemTitle 这个键值设置标签的标题

    选填项:
    UIApplicationShortcutItemSubtitle 设置标签的副标题
    UIApplicationShortcutItemIconType 设置标签icon类型
    UIApplicationShortcutItemIconFile 设置标签的icon文件
    UIApplicationShortcutItemUserInfo 设置信息字典

    这样就可以显示为最开始我展示的样子,但是点击的话还需要添加响应事件。通过下面这个方法的shortcutItemlocalizedTitle或者type,也就是上面必填的那两个键值可以区分点的是哪个标签。然后执行相应的跳转事件。

1
2
3
4
5
6
7
8
9
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
if([shortcutItem.localizedTitle isEqualToString:@"读诗"]){
PoeViewController *poeVC = [[PoeViewController alloc]init];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:poeVC];
[self.window.rootViewController presentViewController:navi animated:YES completion:nil];
}
}

2.peek and pop
首先要通过forceTouchCapability检测设备是否可以支持,如果支持的话就注册。

1
2
3
4
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
// sourceView 要pop的view
[self registerForPreviewingWithDelegate:(id)self sourceView:self.tableView];
}

然后实现Preview的delegate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)context viewControllerForLocation:(CGPoint)point {
//防止重复加入
if ([self.presentedViewController isKindOfClass:[ListenViewController class]]){
return nil;
}
else {
ListenViewController *peekViewController = [[ListenViewController alloc] init];
return peekViewController;
}
}
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
[self showViewController:viewControllerToCommit sender:self];
}

最后如果上拉之后要进行进一步交互的话。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
// 生成UIPreviewAction
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Action 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"Action 2" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"Action 3" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
//添加到到UIPreviewActionGroup中
NSArray *actions = @[action1, action2, action3];
return actions;
}