iOS 3DTouch 日常记录(内附Demo示例代码)

一、3DTouch简介

3DTouch是指通过对屏幕施加不同程度的压力来访问附加功能。应用可以通过显示菜单、展示其他内容和播放动画等形式来表现3DTouch,该功能从6s及其以上机型开始得到支持。

3DTouch主要有三种表现形式

1、主屏交互(Home Screen Interaction)

2、预览和跳转(Peek and Pop)

3、LivePhoto

这里只介绍前面两种

二、主屏交互(Home Screen Interaction)

主屏交互就是在手机桌面,点击应用图标时施加一定的压力。在适当的位置展示的快捷键按钮列表,如图所示:

3DTouch 主屏交互效果.png

主屏交互快捷按钮添加有两种方式

1、静态添加

2、动态添加

扫描二维码关注公众号,回复: 17076665 查看本文章
静态添加

这种方式主要是在工程的info.plist文件中添加相应的属性即可,如下图

静态添加快捷按钮.png

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

猜你喜欢

转载自blog.csdn.net/u013712343/article/details/131591446