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 ()

实现代码:

- (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开发

你可能感兴趣的:(iOS 3D Touch(一) Home Screen Quick Actions)