iPhone6s&iPhone 6s plus发布也有一段时间了,最大的亮点应该就是3D-touch毋庸置疑了,第一时间体验了之后最大的感受就是苹果爸爸太给力了.......事实上我也从未见过第二家公司能把科技与易用性结合的如此天衣无缝的,当年5s指纹识别如此,今年的3D-touch亦如此.苹果也开放了相关的api,作为一个开发者怎能不第一时间在自己的应用上面集成这个好玩的特性呢.
应用中使用3Dtouch有两种方式:
- 第一种是按压图标启动应用的时候,类似于pc上面的右键,但是又不同于右键,我们可以把它理解为一个快速入口,能够有效的减少用户的操作量.这里我们只能使用轻按手势
shortCut
. - 第二种则是应用内的集成了,比如短信列表我们可以轻按预览短信内容,发现感兴趣的话再稍微用力进入详情页面,事实上目前大多数集成了3Dtouch的app也大多数是应用在这个使用场景,即在list-detail之间加了一层预览,变成了list-preview-detail.
上篇先写一下第一种场景如何集成.
这时候我们的所有代码都是在app delegate里面完成的,当然我们也可以写一个分类方便给app delegate瘦身.
在app delegate的代理方法didFinishLaunchingWithOptions里面做如下操作:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
///setup icons
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation];
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePause];
UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"favicon.png"];
///setup items
UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"first" localizedTitle:@"first item title" localizedSubtitle:@"first item detail title" icon:icon1 userInfo:nil];
UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"second" localizedTitle:@"second item title" localizedSubtitle:@"second item detail title" icon:icon2 userInfo:nil];
UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"third" localizedTitle:@"third item title" localizedSubtitle:@"third item detail title" icon:icon3 userInfo:nil];
UIMutableApplicationShortcutItem *item4 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"forth" localizedTitle:@"forth item title" localizedSubtitle:@"forth item detail title" icon:icon4 userInfo:nil];
NSArray *items = @[item1,item2,item3,item4];
[UIApplication sharedApplication].shortcutItems = items ;
UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
if (item) {
NSLog(@"3d launch item is %@",item.localizedTitle);
}else{
NSLog(@"normal launch");
}
return YES;
}
代码还是非常简单的,就是创建四个图标,然后创建四个item,然后给shortcutItems赋值一个数组就可以了.
需要注意的是,使用了iconWithTemplateImageName
方法创建的自定义的图标需要是正方形,单色,而且35*35point尺寸的,不然会显示下面效果图那种黑漆漆的效果.
Icons should be square, single color, and 35x35 points
而我们如果想监听是从哪个item启动的应用,可以在以下方法里面操作:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
NSLog(@"selected item's title is %@",shortcutItem.description);
}
可以看到打印信息:
6.jpg所以这里我们就可以通过shortcutItem.type来判断从哪个入口进入的了,所以我们在调用
- (instancetype _Nonnull)initWithType:(NSString * _Nonnull)type localizedTitle:(NSString * _Nonnull)localizedTitle localizedSubtitle:(NSString * _Nullable)localizedSubtitle icon:(UIApplicationShortcutIcon * _Nullable)icon userInfo:(NSDictionary * _Nullable)userInfo
初始化item的时候,可以自定义一个枚举来作为type参数,方便以后判断.
最终效果如下:
7.jpg你可以在这里下载这个demo
一个问题:
微信实现的图标居右是如何实现的呢?因为没有找到相关的api,难道是通过runtime来修改title跟icon的frame来做到的?
好傻逼的问题,突然发现图片左右是取决于图标在屏幕上的问题........草草草草草
网友评论