3d Touch
是iPhone 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
,在介绍之前,先看一组别人的效果。
注意:
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
上面的
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开发