3D Touch是iOS 9的新特性,趁着6s到手了,赶紧体验了一把,确实方便了不少,今天我就简单的介绍一下。

简单的说3D Touch就是通过区分轻按和重按来进行不同的用户交互。Xcode 7才支持3D Touch的开发,但是这个手势并不支持模拟器,还好在github上找到了一个插件,可以在模拟器上模拟3D Touch的功能。插件的使用在github有上明确的教程,这里就不叙述了。

在苹果的开发者官网上我们可以3D Touch的链接:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/

介绍

3D Touch的主要应用分为三个模块:

1、 Home Screen Quick Actions

通过主屏幕的应用icon,我们可以用3D Touch呼出一个菜单,进行快速定位应用功能模块相关功能的开发。比如下图中的邮件:

2.Peek and Pop

这个功能是一套全新的用户交互机制,在使用3D Touch时,我们可以预览下一个页面的视图,并且可以进行简单的操作。如下图:

3.Force Properties

iOS9为我们提供了一个新的交互参数:力度。我们可以检测某一交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。

实现

1.Home Screen Quick Actions分为静态和动态。静态的只需要在我们项目中的plist文件中配置,然后用户安装就可以使用了,具体的配置信息如下图:

对应的plist文件的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>UIApplicationShortcutItemType</key>
<string>camera</string>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeCompose</string>
<key>UIApplicationShortcutItemTitle</key>
<string>拍照</string>
</dict>
</array>
</plist>

运行结果如下图:

另外一种就是动态的,动态需要我们使用代码来创建,具体使用到的类是UIApplicationShortcutItem,我们可以进入UIApplicationShortcutItem.h文件中包含的东西:

主要包含了三个类:

  • UIApplicationShortcutIcon:创建ShortcutItem中图片icon的类
  • UIApplicationShortcutItem:创建3D Touch的ShortcutItem的类
  • UIMutableApplicationShortcutItem:创建可变3D Touch的ShortcutItem的类

因为这是ios 9新出来的API,所以并不是很复杂,我们来直接使用:

UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"Share" localizedTitle:@"分享" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare] userInfo:nil];

上述代码我们就用代码创建了一个3D Touch的条目,然后赋值给application.shortcutItems即可,运行如下图:

值得提出的是Home Screen Quick Actions最多只能创建四个,多了就不会在显示了。点击每个ShortcutItem的处理在UIApplication中的,如下:

1
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler

然后我们可以针对不用的点击事件做不同的处理。

2.Peek and Pop

首先我们来看一下效果:

这就是 3D Touch另外一个使用的案例。下面我们来说一下具体的实现。

要想在APP中使用3D Touch,首先我们需要判断该设备是否开启3d touch功能,因为用户可以在’设置-通用-辅助功能-3D Touch’中来开启关闭3D Touch功能。幸好这个功能是苹果默认开启的,使用之前我们需要在使用到的ViewController中手动判断一下:

1
2
3
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:self sourceView:self.preBt];
}

[self registerForPreviewingWithDelegate:self sourceView:self.preBt];就是将self.preBt这个视图注册允许使用3D Touch功能。然后我们还需要使用到一个协议UIViewControllerPreviewingDelegate,这个协议中有两个方法:

1
2
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location NS_AVAILABLE_IOS(9_0);
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0);

这两个方法都必须实现,缺一不可,具体的实现过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{

previewingContext.sourceRect = CGRectMake(0, 0, previewingContext.sourceView.frame.size.width, previewingContext.sourceView.frame.size.height);

UIStoryboard *s = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
PreViewController *vc = [s instantiateViewControllerWithIdentifier:@"PreViewController"];
vc.preferredContentSize = CGSizeMake(0, 300);
return vc;

}

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
[self.navigationController pushViewController:viewControllerToCommit animated:YES];
}

最后在我们的目标控制器PreViewController中,可以实现- (NSArray<id<UIPreviewActionItem>> *)previewActionItems,也可以不实现,不实现则没有ActionItem。本文Demo