3D Touch实战演练

摘要

iOS9提供了四类API(Home Screen Quick Action、UIKit Peek & Pop、WebView Peek & Pop和UITouch Force Properties)本篇只演练前两种。

Home Screen Quick Action

主屏幕快速选项,光说这个词不明白啥意思,上一张图就懂了,看图:

就是从图标呼出菜单,那么要实现这种效果,有两种方法

  1. 静态标签
  2. 动态标签

静态标签就是我们在Info.plist中配置,上图的例子就是用静态标签完成的


这里我们介绍一下参数

name 解释 是否必须
UIApplicationShortcutItemType 设置类型字符串,点击后以便在程序中处理
UIApplicationShortcutItemTitle 标题
UIApplicationShortcutItemSubtitle 副标题
UIApplicationShortcutItemIconType 图标,是个枚举值
UIApplicationShortcutItemIconFile 图标文件名
UIApplicationShortcutItemUserInfo 信息字典

建议及提醒

  1. 每个App的Item最多4条,这是系统做的限制。
  2. 要么都用静态标签,要么都用动态标签,两者都采用不会覆盖,但看起来好乱。
  3. 不用纠结呼出菜单的图标位置,是在左边还是右边由你的App图标所在屏幕位置决定,放在左边菜单的图片就在左边,放在右边图标就在右边。

一切都做好了,接下来就是回调了UIApplication为我们提供了回调方法。

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

此处需要注意的是,在App完全退出的情况下,上面方法Handler返回的是NO。
这就需要我们在下面方法中也加入相应的回调处理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

苹果给我们提供了获取Item的方式:

UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];

至此,我们的回调处理就算完成了,看一下完整版的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
    [self actionWithShortcutItem:item];
    
    return YES;
}

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    if (shortcutItem) {
        [self actionWithShortcutItem:shortcutItem];
    }
    
    if (completionHandler) {
        completionHandler(YES);
    }
}

-(void)actionWithShortcutItem:(UIApplicationShortcutItem *)item
{
    if (item) {
        UINavigationController *nav = [(UITabBarController *)self.window.rootViewController viewControllers][0];
        if ([item.type isEqualToString:@"FirstVC"]) {
            [nav.tabBarController setSelectedIndex:0];
        } else {
            [nav.tabBarController setSelectedIndex:1];
        }
    }
}

UIKit Peek & Pop

Peek & Pop就是在我们的程序中,通过按压某一块区域,进行不同的处理,peek是轻按后发生的,pop是在peek后,继续加力后发生的。

依照惯例,我们看下示例图:


上图中,黄色界面展示的就是peek的过程,在peek过程中可以加上Action,第二次进入peek后,再加力进入pop过程,这里我偷了点懒,直接切进了Second View。

在处理的过程中,我们首先要判断3D Touch是否可用。由于用户可能在使用应用的途中切到设置页面开启或关闭3D Touch功能,所以判断代码应放在viewDidAppear中,下面代码判断如果3D Touch可用,那么将tableView注册上。

- (void) check3DTouchAvailable {
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        [self registerForPreviewingWithDelegate:(id)self sourceView:self.tableView];
    }
}

UIViewControllerPreviewingDelegate为我们提供了两个方法,分别用于处理peek过程和pop过程。

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit

别的文章说在peek处理过程中,peek代理方法会进来多次,所以要在处理过程中加判断。由于我手里没有6s,在模拟器中测试peek方法只进来了一次,为了保险起见,我还是加上了判断。

我需要根据点击的位置,判断具体点击了哪一行,然后peek相应行的详情,我们新建一个PeekViewController,用于展示上图中黄色view那部分。

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
    if ([self.presentedViewController isKindOfClass:[PeekViewController class]]) {
        return nil;
    } else {
        CGPoint p = [self.tableView convertPoint:location fromView:self.view];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        
        PeekViewController *peekViewController = [[PeekViewController alloc] init];
        peekViewController.cellTitle = cell.textLabel.text;
        return peekViewController;
    }
}

切换到PeekViewController中,在PeekViewController什么代码都没添加的情况下,弹出来的是一片模糊,我把PeekViewController的背景颜色换成了黄色,就如图中展示的一样,就是块区域。

接下来,如果有需要的话,添加Action,这个就比较容易了,iOS 9在UIViewController中提供了previewActionItems属性,下面代码添加到PeekViewController中。

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"第一个Action" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"点击了第一个Action");
    }];
    
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"第二个Action" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"点击了第二个Action");
    }];
    
    return @[action1,action2];
}

上面代码只展示了UIPreviewAction,如果有需要,Action还可以进行二级菜单的处理,用UIPreviewActionGroup,不过个人觉得这种功能做的太复杂反而不美。

到现在为止图中黄色过程就已经完成了。接下来在pop代理中,实现跳转逻辑,图中只是切换了一下tabbar,就一行代码我就不贴了。

下面是我在写例子过程中参考的文章。

在iOS9中使用3D Touch

浅谈3D Touch(1) -- Home screen quick action

浅谈3D Touch(2) -- UITouch && Peek && Pop

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

推荐阅读更多精彩内容

  • 前言 关于这篇文章 由于iPhone 6S发布不到一年的时间,很多新特性、新技术还未普遍,不管是3D Touch的...
    Tangentw阅读 4,385评论 8 18
  • 1.简单的介绍一下3D Touch 3D Touch的触控技术,被苹果称为新一代多点触控技术。其实,就是此前在Ap...
    Camille_chen阅读 11,977评论 19 33
  • 专著:http://www.jianshu.com/p/3443a3b27b2d 1.简单的介绍一下3D Touc...
    violafa阅读 957评论 1 0
  • 一、3D Touch 介绍 3D Touch 是 Apple 推出的通过压力感触区分轻按和重按来进行不同的用户交互...
    Magician阅读 561评论 1 6
  • 前言 关于3D touch苹果官方文档是这么开始介绍的: 大意如下:iOS9开始,所有新的手机都增加了一个三维的用...
    VV木公子阅读 2,153评论 3 39