iOS 3D Touch(一) Home Screen Quick Actions

3d TouchiPhone 6s+iOS9+之后新增的功能。其最大的好处在于不启动app的情况下,快速进入app中的指定界面,说白了,就是一个快捷入口。
3D touch主要常见的使用:

  • 1:Home Screen Quick Actions (主屏快捷行为入口)
  • 2:peek and pop (预览和弹出)
  • 3:Force Properties (按压力度)
  • 4: Web view peek and pop API (HTML链接预览功能)

本文主要介绍Home Screen Quick Actions,在介绍之前,先看一组别人的效果。

其他app.png

注意:

1.上线的app默认会有一个分享Action Item,也就是图中最后一个Action Item
2.最多可以添加4个Action Item,加上上线后的分享Action Item,最多能显示5个Action Item
3.弹出的3D Touch标签位置是由系统决定的,这里发现一个有趣的事,Action Item弹出位置靠屏幕下边或者屏幕上边,其顺序也是相反的。

有两种方法可以实现Home Screen Quick Actions,一种是使用.plist文件静态声明,另一种是使用 UIApplicationShortcutItem 对象构造。 静态构造的quick actions可以在你的app第一次安装时候就有效果,而动态构造方法必须在第一次运行之后才能有效果。不难发现,现在大多数app都是动态构造方法实现的,什么,不信,你可以去试试!

1.plist文件静态声明实现Home Screen Quick Actions

官网示例.png

上面的app展示图中有5个Action Item,其中每个Action是使用UIApplicationShortcutItem这个对象进行描述的,下面列出每一个UIApplicationShortcutItem中能够包含的信息:

名称 说明 是否必须
UIApplicationShortcutItemType 事件的唯一标识,可以通过这个标识来辨别你具体点击了哪个事件
UIApplicationShortcutItemTitle 标题,在没有子标题的情况下如果标题太长能自动换行
UIApplicationShortcutItemSubtitle 子标题,在标题的下方
UIApplicationShortcutItemIconType 枚举选取系统中的一个图标类型
UIApplicationShortcutItemIconFile 自定义一个图标,以单一颜色35x35的大小展示,如果设置这个,UIApplicationShortcutItemIconType将不起作用,图片必须预先添加进项目,而不能使用网络路径
UIApplicationShortcutItemUserInfo 字典,里面可以添加各种key,value对

UIApplicationShortcutItemIconType 这个key可以使用一些系统自定义的icon, 可选的类型的枚举如下,详细介绍和每个图片的样子可以参考这里

2.以动态方式创建

检测是否支持3D Touch

在iOS9中提供如下的接口用于检查设备是否支持3D Touch

@property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability NS_AVAILABLE_IOS(9_0); // unspecified: UIForceTouchCapabilityUnknown

其中UIForceTouchCapability是一个枚举类型,具体的描述情况如下:

typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
    UIForceTouchCapabilityUnknown = 0,//3D Touch检测失败
    UIForceTouchCapabilityUnavailable = 1, //3D Touch不可用
    UIForceTouchCapabilityAvailable = 2 //3D Touch可用
};

注意

由于兼容iOS 8.0,所以需要对3D Touch的检测,并且不能通过机型来判断3D Touch的可用与否,因为用户可能会在设置中把此功能关闭。

代码部分

这里分两种情况:
1.程序在被杀死的情况下,点击图标进入程序,会进入

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

2.程序在后台,点击图标进入程序,会进入

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

首先在AppDelegate遵守协议(判断3d touch 是否可用)

@interface AppDelegate ()<UITraitEnvironment>

实现代码:

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

    if (@available(iOS 9.0, *)) {
        
        // 检测3d touch 是否可用
        if (self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
            
            //手动创建3D Touch选项
            //系统风格的icon
            //    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            //    UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            //    UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            //    UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            
            //自定义图标
            UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"14Eleven"];
            UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"11Eleven"];
            UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"OVEleven"];
            UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"PregnancyEleven"];
            
            //创建选项
            UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.14Eleven" localizedTitle:@"尿14项检测" localizedSubtitle:nil icon:icon1 userInfo:nil];
            UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.11Eleven" localizedTitle:@"尿11项检测" localizedSubtitle:nil icon:icon2 userInfo:nil];
            UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.OVEleven" localizedTitle:@"排卵检测" localizedSubtitle:nil icon:icon3 userInfo:nil];
            UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.pregnancyEleven" localizedTitle:@"早孕检测" localizedSubtitle:nil icon:icon4 userInfo:nil];
            //添加到选项数组
            [UIApplication sharedApplication].shortcutItems = @[item4,item3,item2,item1];
            
            UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
            if (shortcutItem) {
                //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
                if([shortcutItem.type isEqualToString:@"com.niaodaifu.14Eleven"]){ // 14
                    
                    [self detectionRoutineUrine_14Eleven];
                } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.11Eleven"]) { // 11
                    
                    [self detectionRoutineUrine_11Eleven];
                } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.OVEleven"]) { // 排卵
                    
                    [self detectionRoutineUrine_OVEleven];
                } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.pregnancyEleven"]) { // 早孕
                    
                    [self detectionRoutineUrine_pregnancyEleven];
                }
                return NO;
            }
        }
    }
    return YES;
}

程序在后台,点击图标会进去这个代理方法:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    
    //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
    if([shortcutItem.type isEqualToString:@"com.niaodaifu.14Eleven"]){ 
        
        [self detectionRoutineUrine_14Eleven];
    } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.11Eleven"]) { 
        
        [self detectionRoutineUrine_11Eleven];
    } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.OVEleven"]) { 
        
        [self detectionRoutineUrine_OVEleven];
    } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.pregnancyEleven"]) { 
        
        [self detectionRoutineUrine_pregnancyEleven];
    }
    
    if (completionHandler) {
        completionHandler(YES);
    }
}
对于如何进入主程序中任意一个界面,分两种情况:

1.根界面

- (void)detectionRoutineUrine_11Eleven {
    
      UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController;
      tabBarVC.selectedIndex = 2;
}

2.其他非根界面,如二级、三级界面.....

-(void)detectionRoutineUrine_11Eleven {
    
    UINavigationController *nav = ((UITabBarController*)self.window.rootViewController).selectedViewController;
    CameraViewController *VC = [[CameraViewController alloc] init];
    [nav pushViewController:VC animated:YES];
}
最后来一张效果图吧
上线成功

参考

在iOS9中使用3D Touch
iOS 3D touch开发(一) Home Screen Quick Actions
iOS 3D Touch 开发
iOS 3D Touch开发

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

推荐阅读更多精彩内容