3D Touch简介

随着iOS9以及iPhone 6s和iPhone 6s plus的发布,苹果添加一种立体的用户界面:
用户在主屏幕上不需要打开APP,按压图标就可以快速访问APP提供的一些功能。
在APP内,用户按压界面就可以预览更多地内容,获得加速访问的特征,从而给界面交互方式开启一个新的维度。

3D Touch的主要应用

文档给出的应用介绍主要有两块:

1.A user can now press your Home screen icon to immediately access functionality provided by your app.2.Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.

第一部分的应用是我们可以通过3D手势,在主屏幕上的应用Icon处,直接进入应用的响应功能模块。这个功能就例如我们上面的日历示例,会在Icon旁边出现一个菜单,点击菜单我们可以进入相应的功能单元。

我个人理解,这个功能,push消息功能加上iOS8推出的扩展today功能,这三个机制使iOS应用变得无比灵活方便,用户可以不需付出寻找的时间成本来快速使用自己需要的功能。

第二部分是对app的一个优化,用户可以通过3D Touch手势在view上来预览一些预加载信息,这样的设计可以使app更加简洁大方,交互性也更强。

模拟器如何使用3D Touch功能

大神们已经帮我们想好了,请看这里

3D Touch的三大模块

3D Touch的三大模块

1、Home Screen Quick Actions

通过主屏幕的应用Icon,我们可以用3D Touch呼出一个菜单,进行快速定位应用功能模块相关功能的开发。如上面的日历。

2、peek and pop

这个功能是一套全新的用户交互机制,在使用3D Touch时,ViewController中会有如下三个交互阶段:

(1)提示用户这里有3D Touch的交互,会使交互控件周围模糊

(2)继续深按,会出现预览视图

(3)通过视图上的交互控件进行进一步交互

这个模块的设计可以在网址连接上进行网页的预览交互。

3.Force Properties

iOS9为我们提供了一个新的交互参数:力度。我们可以检测某一交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。

Home Screen Quick Action使用与相关api详解

iOS9为我们提供了两种屏幕标签,分别是静态标签动态标签

1、静态标签

静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序会在动态标签的前面。

我们先来看静态标签的配置:

首先在info.plist文件中添加如下键值

先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:

必填项(下面两个键值是必须设置的):

UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串

UIApplicationShortcutItemTitle 这个键值设置标签的标题

选填项(下面这些键值不是必须设置的):

UIApplicationShortcutItemSubtitle 设置标签的副标题

UIApplicationShortcutItemIconType 设置标签Icon类型

UIApplicationShortcutItemIconFile 设置标签的Icon文件

UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)

我们如上截图设置后,运行程序,用我们前面的方法进行测试,效果如下

2、动态标签

动态标签是我们在程序中,通过代码添加的,与之相关的类,主要有三个:

UIApplicationShortcutItem 创建3DTouch标签的类

UIMutableApplicationShortcutItem 创建可变的3DTouch标签的类

UIApplicationShortcutIcon 创建标签中图片Icon的类

因为这些类是iOS9中新增加的类,所以其api的复杂程度并不大,下面我们来对其中方法与属性进行简要讲解:

@interface UIApplicationShortcutItem : NSObject <NSCopying, NSMutableCopying>
//下面是两个初始化方法 通过设置type,title等属性来创建一个标签,这里的icon是UIApplicationShortcutIcon对象,我们后面再说
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;
//下面这是一些只读的属性,获取相应的属性值
@property (nonatomic, copy, readonly) NSString *type;
@property (nonatomic, copy, readonly) NSString *localizedTitle;
@property (nullable, nonatomic, copy, readonly) NSString *localizedSubtitle;
@property (nullable, nonatomic, copy, readonly) UIApplicationShortcutIcon *icon;
@property (nullable, nonatomic, copy, readonly) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo;
//这个类继承于 UIApplicationShortcutItem,创建的标签可变
@interface UIMutableApplicationShortcutItem : UIApplicationShortcutItem
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *localizedTitle;
@property (nullable, nonatomic, copy) NSString *localizedSubtitle;
@property (nullable, nonatomic, copy) UIApplicationShortcutIcon *icon;
@property (nullable, nonatomic, copy) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo;
@end
//这个类创建标签中的icon
@interface UIApplicationShortcutIcon : NSObject <NSCopying>
//创建系统风格的icon
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
//创建自定义的图片icon
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;
@end

创建好标签后,将其添加如application的hortcutItems数组中即可,示例如下:

- (void)setupApplicationShortcutItems{UIApplicationShortcutIcon *videoIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_sight_action"];UIApplicationShortcutIcon *messageIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_chat_action"];NSDictionary *userInfo1 = @{@"key":@"chat"};NSDictionary *userInfo2 = @{@"key":@"video"};UIMutableApplicationShortcutItem *messageShortcutItem = [[UIMutableApplicationShortcutItem alloc] initWithType:@"justinjing.chat" localizedTitle:@"新建聊天" localizedSubtitle:@"新建消息页" icon:messageIcon userInfo:userInfo1];UIMutableApplicationShortcutItem *videoShortcutItem = [[UIMutableApplicationShortcutItem alloc] initWithType:@"justinjing.video" localizedTitle:@"录制小视频" localizedSubtitle:@"录制朋友圈小视频" icon:videoIcon userInfo:userInfo2];NSArray *items = @[videoShortcutItem,messageShortcutItem];NSArray *exsitItems = [UIApplication sharedApplication].shortcutItems;NSArray *updateItems = [exsitItems arrayByAddingObjectsFromArray:items];[UIApplication sharedApplication].shortcutItems = updateItems;
}

看上去是不是非常和谐?其实我告诉你,我们已经踩到了坑里了

我在运行中发现:

NSArray *existingItems = [UIApplication sharedApplication].shortcutItems;

所获得的existingItems并不是我们之前设置在info.plist里面的,而是上一次

[UIApplication sharedApplication].shortcutItems = updatedItems;

赋值给他的,又因为我自作聪明的做了一次

NSArray *updatedItems = [existingItems arrayByAddingObjectsFromArray:items];

所以我们每运行一次,shortcutItems中的元素个数就会多3个,

那为什么展示出来没有问题呢?

仔细看刚刚发的那张效果图,我擦,只有4个,对了,这个就是表象上不出错的原因,在API上并没有写shortcutItems有任何个数限制,也没有写快捷窗口的个数,但是实际上,最多只能显示4个,而且shortcutItems这个里面的对象恐怕是早已被系统默默的存到了某个plist里了,每当程序启动时,会向系统要app的Bundle Identifier对应的shortcutItems,并非我们事先想要的info.plist中的items,当然以上只是我从现象做出的合理猜测,我们并不需要关心info.plist中的那些静态item,只需要动态创建的item直接打包赋值过去

[UIApplication sharedApplication].shortcutItems = @[item1, item2, item3];

至于只展示4个的问题,这个我们无能为力了,系统做了限制

3、Item点击回调,响应标签的行为

类似推送,当我们点击标签进入应用程序时,也可以进行一些操作,我们可以看到,在applocation中增加了这样一个方法:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0);

当我们通过标签进入app时,就会在appdelegate中调用这样一个回调,我们可以获取shortcutItem的信息进行相关逻辑操作。

这里有一点需要注意:我们在app的入口函数:

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

也需要进行一下判断,在launchOptions中有UIApplicationLaunchOptionsShortcutItemKey这样一个键,通过它,我们可以区别是否是从标签进入的app,如果是则处理结束逻辑后,返回NO,防止处理逻辑被反复回调。

UIApplication又给我们一个从launchOptions中获取这个shortcutItem的key–UIApplicationLaunchOptionsShortcutItemKey,所以在这2个都进行对shortcutItem的操作后,我们这个功能算是完成了

在didFinishLaunchingWithOptions中,由于某些客户端会有启动动画,所以这边加了3秒,具体因程序而异

UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{__strong typeof(weakSelf) strongSelf = weakSelf;if (strongSelf){[strongSelf actionWithShortcutItem:item];}
});

在performActionForShortcutItem回调中

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

最后就是统一处理actionWithShortcutItem的地方,由于我这个demo中所有的type对应的行为都一样的,所以我这边没有对type做区分,甚至所以的item可以用同一个type:

- (void)quickActionWithShortcutItem:(UIApplicationShortcutItem *)shortcutItem
{if (shortcutItem.userInfo){NSLog(@"open===%@  %@",shortcutItem.type,shortcutItem.userInfo);NSDictionary *dic = shortcutItem.userInfo;UIAlertView *alert = [[UIAlertView alloc]                                  initWithTitle:shortcutItem.typemessage:dic[@"key"]delegate:selfcancelButtonTitle:@"确定"otherButtonTitles:nil, nil];[alert show];}
}

几点注意:

1、快捷标签最多可以创建四个,包括静态的和动态的。

2、每个标签的题目和icon最多两行,多出的会用...省略


结语

关于3DTouch在UIView中的预览功能和UITouch中新增加的力度属性的应用,因为不好演示,这里就不再总结,大家可以通过头文件中相应的类和属性来了解他们,最后,如有疏漏和错误之处,欢迎指正

文中demo下载

3D Touch 使用心得(仿微信3D Touch)相关推荐

  1. R语言生成仿真的3D高斯簇数据集、使用scale函数进行数据缩放、并使用KMeans进行聚类分析、数据反向缩放并比较聚类生成的中心和实际数据的中心的差异、预测新的数据所属的聚类簇

    R语言生成仿真的3D高斯簇数据集.使用scale函数进行数据缩放.并使用KMeans进行聚类分析.数据反向缩放并比较聚类生成的中心和实际数据的中心的差异.预测新的数据所属的聚类簇 目录

  2. HTML5 Canvas 高仿逼真 3D 布料图案效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.下面给大家分享一个 HTML5 C ...

  3. 视频教程-Layabox3D游戏开发入门-微信3D小游戏案例 -微信开发

    Layabox3D游戏开发入门-微信3D小游戏案例 有多年Unity程序开发经验,有策划和美术设计的经验.愿意在csdn这个平台和大家一起分享! 金龙 ¥29.00 立即订阅 扫码下载「CSDN程序员 ...

  4. Android studio心得——用fragment仿微信APP

    前言 今天我想与大家分享一些关于如何利用fragment实现仿微信APP的经验.作为社交领域最受欢迎.功能齐全且可扩展性强的应用之一,微信APP在浏览器首页和个人中心之上还有一个重要部分:底部导航栏. ...

  5. 微信/支付宝touch列表滑动删除案例

    代码 如果不让滑动事件冒泡的话.将bind/on改为catch就好了 <view class="cont"><view class="title&quo ...

  6. 三星 SGH-G810 多普达 P800 多普达 Touch Diamond(S900) 多普达 P860 多普达 Touch(T3238) 对比...

    产品名称 三星 SGH-G810 多普达 P800 多普达 Touch Diamond(S900) 多普达 P860 多普达 Touch(T3238) 产品图片 基本参数 手机昵称 G810 - Di ...

  7. 使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课...

    前言: 今年是建国70周年,爱国热情异常的高涨,为自己身在如此安全.蓬勃发展的国家深感自豪. 我们公司楼下为庆祝国庆,拉了这样的标语,每个人做好一件事,就组成了我们强大的祖国. 看到这句话,深有感触, ...

  8. android按住录音按钮_Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)...

    先给大家展示下效果图,如果大家感觉不错,请参考使用方法, 效果图如下所示: 使用方法: 录音工具类:AudioRecoderUtils.java,代码如下: public class AudioRec ...

  9. Android自定义ListView实现仿微信侧滑删除

    经常在遇到问题第一时间都会在网上搜索解决的方法,因此看到很多前辈们的比较精辟的技术文章,学习了很多东西,现在将自己平时工作中开发的一些小功能坐下总结,也写出来,既方便自己理清思路记忆功能块实现思路,又 ...

最新文章

  1. 2020年数据科学领域4个最热门的趋势
  2. mysql用户权限管理的问题
  3. update操作报错
  4. mysql怎么查询排第几名并列_MySQL并列排名和顺序排名查询
  5. pytorch Tensor操作(二)
  6. JS键盘字母相应的keyCode值
  7. WORD如何将多文档快速汇总到一份WORD文件里面?
  8. [转帖]/proc/sys/net/ipv4/ 下参数理解
  9. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...
  10. CentOS7默认安装PHP不支持mysql的办法
  11. CC2530定时器唤醒
  12. Windows压力测试工具SuperBenchmarker
  13. c语言json数据转换成字符串,C语言将字符串转json
  14. 高项考试-信息化知识
  15. Java 多线程 生产者和消费者
  16. 外汇EA量化交易特点
  17. LINUX保留原分区,linux 分区扩展 (保留数据)
  18. charles证书信任设置
  19. 触发器一(触发器简介)
  20. python求素数对(质数对)个数

热门文章

  1. google地图和google地球,用更高分辨率的图片来更新全世界地理信息
  2. 3. React 组件中怎么做事件代理?它的原理是什么?
  3. AT89C51 汇编语言实现LED间隔1s闪烁(已验证)
  4. SPI(Service Provider Interface)详解
  5. dubbo SPI使用:@SPI 与 @Adaptive
  6. matlab中去除回车换行符
  7. js验证字符串是否为正则表达式
  8. 蓝桥杯——逗志芃的暴走 (C++)
  9. 基于SSM学生档案管理
  10. pyLDAvis对LDA模型结果进行可视化,html文件打开为空白