一、3DTouch简介
3DTouch是指通过对屏幕施加不同程度的压力来访问附加功能。应用可以通过显示菜单、展示其他内容和播放动画等形式来表现3DTouch,该功能从6s及其以上机型开始得到支持。
3DTouch主要有三种表现形式
1、主屏交互(Home Screen Interaction)
2、预览和跳转(Peek and Pop)
3、LivePhoto
这里只介绍前面两种
二、主屏交互(Home Screen Interaction)
主屏交互就是在手机桌面,点击应用图标时施加一定的压力。在适当的位置展示的快捷键按钮列表,如图所示:
主屏交互快捷按钮添加有两种方式
1、静态添加
2、动态添加
静态添加
这种方式主要是在工程的info.plist文件中添加相应的属性即可,如下图
UIApplicationShortcutItem:主屏交互快捷按钮类型
UIApplicationShortcutItemIconFile:主屏交互中使用的按钮自定义图片名(可选)
UIApplicationShortcutItemTitle:主屏交互中使用的按钮名称(必填)
UIApplicationShortcutItemType:主屏交互中使用的按钮的唯一标示符,用作判断点击了哪一个快捷按钮(必填)
UIApplicationShortcutItemSubtitle:快捷可选项的子标题(可选)
UIApplicationShortcutItemIconType:快捷可选项的图标(可选)
UIApplicationShortcutItemUserInfo:快捷可选项的附加信息(可选)
动态添加
动态添加就是我们通过代码的形式把shortcutItmes对象数组传递给UIApplication单例对象。初始化shortcutItems对象这一步,我们可以在App的启动方法里去操作:
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
初始化shortcutItem对象示例代码:
//开始直播
UIApplicationShortcutIcon *liveIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"3d_touch_live"];
UIApplicationShortcutItem *liveItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.startLive" localizedTitle:@"开始直播" localizedSubtitle:nil icon:liveIcon userInfo:nil];
//私信
UIApplicationShortcutIcon *messageIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"3d_touch_message"];
UIApplicationShortcutItem *messageItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.message" localizedTitle:@"私信" localizedSubtitle:nil icon:messageIcon userInfo:nil];
//关注的人
UIApplicationShortcutIcon *followIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"3d_touch_live"];
UIApplicationShortcutItem*followItem = [[UIApplicationShortcutItemalloc]initWithType:@"com.follow"localizedTitle:@"关注的人"localizedSubtitle:nilicon:followIcon userInfo:nil];
[[UIApplicationsharedApplication]setShortcutItems:@[liveItem,messageItem,followItem]];
实例方法:
- (instancetype)initWithType:(NSString*)type localizedTitle:(NSString*)localizedTitle localizedSubtitle:(nullableNSString*)localizedSubtitle icon:(nullableUIApplicationShortcutIcon*)icon userInfo:(nullableNSDictionary*)userInfo
type:主屏交互中使用的按钮的唯一标示符,用作判断点击了哪一个快捷按钮(必填)
localizedTitle:主屏交互中使用的按钮名称(必填)
localizedSubtitle:快捷可选项的子标题(可选)
icon:主屏交互中使用的按钮图片名(可选)
userInfo:快捷可选项的附加信息(可选)
使用系统的icon实例方法
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type
使用自定义的icon实例方法
+ (instancetype)iconWithTemplateImageName:(NSString*)templateImageName
监听主屏交互按钮点击事件
- (void)application:(UIApplication*)application performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void(^)(BOOL))completionHandler
通过shortcutItem.type 也就是按钮的唯一标识符。可以知道我们点击的是哪个按钮,可以在这里做相应的事件处理
三、预览和跳转(Peek and Pop)
Peek and Pop 在操作上是指用户在手机屏幕上用力按压想要预览的选项位置,弹出一个可以预览二级页面的预览窗口,可以根据设置,设置一些快捷的操作选项,以类似sheetAlertView的方式呈现出来。上效果图:
1、在ListView视图控制器遵守协议<UIViewControllerPreviewingDelegate>
2、在ListView视图控制器注册3DTouch
//判断是否支持3DTouch 防止程序crash
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
//cell 注册3DTouch
[self registerForPreviewingWithDelegate:self sourceView:cell];
}
sourceView是需要响应3DTouch的视图
3、实现peek方法
- (UIViewController*)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location
{
//预览页面显示导航栏
PreviewViewController *previewVC = [[PreviewViewController alloc] init];
NavgationViewController *nav = [[NavgationViewController alloc] initWithRootViewController:previewVC];
return nav;
//预览页面不显示导航栏
// PreviewViewController *previewVC = [[PreviewViewController alloc] init];
// return previewVC;
}
如果预览页需要显示导航栏的同时也需要上滑显示快捷菜单,就需要写一个基类继承UINavigationController。重写方法,具体可看我Demo
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
这是我自己摸索出来的,如果你还有更好的方法,请大声说告诉我
4、实现pop方法
- (void)previewingContext:(id)previewingContext commitViewController:(UIViewController*)viewControllerToCommit
{
//相当于push操作
PreviewViewController *previewVC = [[PreviewViewController alloc] init];
[self showViewController:previewVC sender:self];
}
5、快捷菜单的生成(类sheetAlertView)
在PreviewViewController视图控制器重写方法
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
NSMutableArray *items = [[NSMutableArray alloc] init];
UIPreviewAction*action0 = [UIPreviewActionactionWithTitle:@"标为未读"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction*_Nonnullaction,UIViewController*_NonnullpreviewViewController) {
NSLog(@"点击-->标为未读");
}];
UIPreviewAction*action1 = [UIPreviewActionactionWithTitle:@"免打扰"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction*_Nonnullaction,UIViewController*_NonnullpreviewViewController) {
NSLog(@"点击-->免打扰");
}];
UIPreviewAction*action2 = [UIPreviewActionactionWithTitle:@"置顶"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction*_Nonnullaction,UIViewController*_NonnullpreviewViewController) {
NSLog(@"点击-->置顶");
}];
UIPreviewAction*action3 = [UIPreviewActionactionWithTitle:@"删除"style:UIPreviewActionStyleDestructivehandler:^(UIPreviewAction*_Nonnullaction,UIViewController*_NonnullpreviewViewController) {
NSLog(@"点击-->删除");
}];
[itemsaddObjectsFromArray:@[action0,action1,action2,action3]];
returnitems;
}
示例代码3DTouchDemo