在iOS 9中,新iPhone将第三维度添加到了用户界面。
- 用户现在可以用力摁下主屏按钮来快捷调出应用提供的功能菜单。
- 在应用中,用户现在可以用力摁下视图以查看更多内容的预览并且快捷访问一些功能。
示例代码可以在这里下载:
- ApplicationShortcuts: Using UIApplicationShortcutItem,演示了主屏静态和动态快捷选项。
- ViewControllerPreviews: Using the UIViewController previewing APIs,示范了 peek (预览)和 pop (详阅),以及peek快捷选项。
- TouchCanvas: Using UITouch efficiently and effectively,示范了在 UITouch 类中新的压力属性。
在你开始使用前,请阅读 iOS Human Interface Guidelines 中 3D Touch 一节
主屏幕快捷选项
主屏幕快捷选项给用户提供了不用打开app的快捷操作, 每个app根据自己的特点设置不一样的选项。但这个功能只有最新的iPhone6S和iPhone6S plus的支持。
具体实现:
1.定义主屏快捷选项
iOS 9支持主屏静态和动态快捷选项。
静态快捷选项(Static quick actions)
当用户安装完应用后立即就能使用。在应用的 Info.plist 文件中的 UIApplicationShortcutItems 数组中定义 静态快捷选项。动态快捷选项(Dynamic quick actions)
在用户第一次加载应用后可用。使用 UIApplicationShortcutItem 、UIMutableApplicationShortcutItem 以及 UIApplicationShortcutIcon 类和相关的API来定义 动态快捷选项 。使用 shortcutItems 属性来添加动态快捷选项到应用共享的 UIApplication 对象中。
在iOS 9中,一个应用最多能展示四个主屏快捷选项。在这个限制下,系统首先展示静态快捷选项,以plist菜单中的第一个为首。如果你的静态选项不够四个,并且你也定义了动态快捷选项,那么会展示一个或多个动态快捷选项。
两种快捷选项都可以显示最多两行文本和一个可选的图标。系统会格式化文本,排列包装它,并且适当的添加省略号。
实现方法:
1) 静态方式
打开Info.plist,增加UIApplicationShortcutItems,类型为Array.为它创建具体的items,最多四个。
设置每个item的key和value。key的列表如下:(更详细的说明请看官方文档)
- UIApplicationShortcutItemType (required)
string格式,item的标识,用于在app里判断是那个item被点击 - UIApplicationShortcutItemTitle (required)
- UIApplicationShortcutItemSubtitle
- UIApplicationShortcutItemUserInfo
- UIApplicationShortcutItemIconFile
值为icon的图片名称。Apple对icon的要求是:Icons should be square, single color, and 35x35 points。 - UIApplicationShortcutItemIconType
使用系统的图标时设置它的值,但当有UIApplicationShortcutItemIconFile这个key时,UIApplicationShortcutItemIconType的设置会被自动忽略。具体的值请看官方文档。
2)动态方式
UIApplication *app = [UIApplication sharedApplication];
//1.获取shortcutItems
NSArray *existingShortcutItems = [app shortcutItems];
//2.获取第0个shortcutItem
UIApplicationShortcutItem *oldItem = [existingShortcutItems objectAtIndex: 0];
//3.更新shortcutItems
//将旧的shortcutItem改变为可修改类型shortcutItem
UIMutableApplicationShortcutItem *mutableItem = [oldItem mutableCopy];
//修改shortcutItem的显示标题
[mutableItem setLocalizedTitle: @“Share”];
//根据旧的shortcutItems生成可变shortcutItems数组
NSMutableArray *updatedShortcutItems = [existingShortcutItems mutableCopy];
//修改可变shortcutItems数组中对应index下的元素为新的shortcutItem
[updatedShortcutItems replaceObjectAtIndex: 0 withObject: mutableItem];
//修改应用程序对象的shortcutItems为新的数组
[app setShortcutItems: updatedShortcutItems];
2. 接收点击事件
在AppDelegate.m中添加如下方法:
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void(^)(BOOL succeeded))completionHandler
{
if([shortcutItem.type isEqualToString:@"item.identify0"]){
//item0点击后的响应
}
}
3.检测3D touch是否可用
由于用户可能会在系统设置中关闭3D touch功能,为了确保你的用户能够完整使用你app,请根据3D Touch是否可用来分别规划你的代码。当3D Touch可用时,尽可能利用它的功能;当不能使用时,提供可供替代的方案,比如由UILongPressGestureRecognizer类实现的触摸和长按。
检测方法:读取那些拥有环境特征(a trait environment,见 UITraitEnvironment]Protocol Reference)的对象的特征集合(trait collection)的 forceTouchCapability 属性值。在你实现的 traitCollectionDidChange: 代理方法中把读取这个属性的值作为其一部分。
if (traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"你的手机支持3D Touch!");
}
else {
NSLog(@"你的手机暂不支持3D Touch!");
}
}
Peek和Pop
自iOS9开始,当你按压一个特定的页面时,会呈现出额外的信息供你预览。随着用户按压力量的增加,交互会出现三个阶段,当你使用 peek 和 pop 时,系统通过压力决定从哪个阶段过度至下一个。用户可以在设置>通用>辅助功能>3D Touch中进行修改。
交互的三个阶段:
1.暗示内容预览是可使用的
轻按后,屏幕视图就会过渡到 peek,周围内容会变得模糊,这告诉用户预览更多内容( peek )是可以使用的。
如果用户这时结束了触碰,peek就会消失并且应用回到交互开始之前的状态。
2.展示预览(peek),和快捷选项菜单(peek quick actions)
3.可选的跳转到预览中的视图(pop)
用户可以在peek界面上更用力按下来跳转到使用peek呈现的视图,这个过渡动画会使用系统提供的pop过渡。pop出来的视图会填满你应用的根视图并显示一个返航按钮可以回到交互开始的地方。(图中没有显示最后展示pop视图的阶段)
如果用户一直保持触摸,可以向上滑动Peek视图,系统会展示出你预先设置和peek关联的peek快速选项。
每一项peek快速选项都是你应用中的深度链接。当peek快速选项出现后,用户可以停止触摸而且peek会停留在屏幕中。用户可点击一个快速选项,唤出相关链接。
为了在具备3D Touch功能的设备上支持peek和pop,你需要:
代理对象接受3D Touch的protocols : < UIViewControllerPreviewingDelegate >
在UIViewController中实现协议内的peek和pop方法:
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)context viewControllerForLocation:(CGPoint) point
{
UIViewController *childVC = [[UIViewController alloc] init];
childVC.preferredContentSize = CGSizeMake(0.0f,300f);
CGRect rect = CGRectMake(10, point.y - 10, self.view.frame.size.width - 20,20);
context.sourceRect = rect;
return childVC;
}
- (void)previewContext:(id<UIViewControllerPreviewing>)context commitViewController:(UIViewController*)vc
{
[self showViewController:vc sender:self];
}
- 在UIViewController内声明注册方法:
[self registerForPreviewingWithDelegate:self sourceView:self.view];
压力属性
在iOS 9中,UITouch类新增两个CGFloat类型属性:force和maximumPossibleForce,这些属性可以让你侦测并响应APP接收的IEvent对象中的触摸压力,当然前提是你的设备必须支持3D Touch。
参考文献:
[1] Apple官方文档
[2] 《iOS9 3DTouch、ShortcutItem、Peek And Pop技术一览》
[3] 《在iPhone上使用3D Touch》