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、动态添加

静态添加

这种方式主要是在工程的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 耐旱的仙人掌分类:iOS开发来源:蚊香酱的简书 专著:http://www.cocoachina.com/ios/...
    violafa阅读 606评论 0 0
  • 自苹果在2015年发布3dtouch功能以来, iPhone 6s之后的机型全都匹配了 3dtouch功能。此功能...
    _铲屎官_阅读 7,267评论 1 18
  • 1. 3D Touch的主要应用 官方文档给出的应用介绍主要有两块: 1.A user can now press...
    雨润听潮阅读 727评论 0 0
  • 3D Touch 3D Touch是一种立体触控技术,被苹果称为新一代多点触控技术,是在Apple Watch上采...
    送我迷迭香阅读 388评论 0 0
  • 概述 iOS10系统登录中国,在系统中对3D Touch的使用需求更频繁,所以对iOS9中便引入的3D Touch...
    微冷l阅读 567评论 0 1