3dtouch技术原理_3dtouch是怎么实现的?

什么是3d touch 3d touch是一种立体触控技术,被苹果称为新一代多点触控技术,是在apple watch上采用的force touch,屏幕可感应不同的感压力度触控。3d touch,苹果iphone 6s的新功能,看起来类似 pc 上的右键。有peek pop 两种新手势。
2015年9月10日,苹果在新品发布会上宣布了3d-touch功能。 2016年6月13日,苹果开发者大会wwdc在旧金山召开,会议宣布可以在待机画面用3d touch操作通知。
现在,许多安卓手机也用上了3d touch。
3dtouch技术原理 实现3d touch 的关键在于retina hd 屏电容屏幕和strain gauges 应变传感器的相互配合,听起来简单,但事实上apple花费了大量时间来实现3d touch 技术。
应变传感器即变形测量器,顾名思义,就是一种能够测量物体形变程度的传感器。为了能够使3dtouch 更加准确。apple 在屏幕下方集成了两层应变传感器,一层用以测量屏幕的形变,另一层检测屏幕因温度变化而产生的形变,并计算补偿误差。
另外,集成在retina hd 屏幕当中的电容传感器也使用了“蛇形”结构,以顺应按压屏幕的力的方向,使得应变传感器可以顺利检测到屏幕的形变。
3dtouch是怎么实现的? 3dtouch目前在手机上有两种体现方式,一种是用力按下app的图片icon,会弹出选项菜单,就像电脑上的右键。一种是在应用内的界面上用力按下,弹出的预览界面。
接下来就以这两种效果分别说明如何使用3dtouch功能。
一、iocn按下效果
这里有两种方式实现:
1、通过plist文件静态设置
[objc] view plain copyuiapplicationshortcutitemuserinfo信息
uiapplicationshortcutitemiconfile图标名称
uiapplicationshortcutitemicontype图标类型
uiapplicationshortcutitemtitle标题
uiapplicationshortcutitemsubtitle副标题
然后在appdelegate里面实现代理方法,通过绑定的标签type来实现具体代码。
[objc] view plain copy-(void)application:(uiapplication *)application performactionforshortcutitem:(uiapplicationshortcutitem *)shortcutitem completionhandler:(void (^)(bool))completionhandler
{
uinavigationcontroller *nav = (uinavigationcontroller *)self.window.rootviewcontroller;
if([shortcutitem.type isequaltostring:@“one”]){
uiviewcontroller *vc = [[uiviewcontroller alloc] init];
vc.title = @“第一个”;
vc.view.backgroundcolor = [uicolor redcolor];
[nav pushviewcontroller:vc animated:yes];
}else if ([shortcutitem.type isequaltostring:@“two”]){
uiviewcontroller *vc = [[uiviewcontroller alloc] init];
vc.title = @“第二个”;
vc.view.backgroundcolor = [uicolor greencolor];
[nav pushviewcontroller:vc animated:yes];
}
}
2、通过代码动态创建
首先在appdelegate的didfinishlaunchingwithoptions里面初始化
[objc] view plain copy- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
// override point for customization after application launch.
self.window = [[uiwindow alloc]initwithframe:[uiscreen mainscreen].bounds];
uinavigationcontroller *nav = [[uinavigationcontroller alloc]initwithrootviewcontroller:[[viewcontroller alloc]init]];
self.window.rootviewcontroller = nav;
[self.window makekeyandvisible];
[self setup3dtouch:application];
// [self setupspotlight];
return yes;
}
具体初始化方法
[objc] view plain copy- (void)setup3dtouch:(uiapplication *)application
{
/**
type 该item 唯一标识符
localizedtitle :标题
localizedsubtitle:副标题
icon:icon图标 可以使用系统类型 也可以使用自定义的图片
userinfo:用户信息字典 自定义参数,完成具体功能需求
*/
// uiapplicationshortcuticon *icon1 = [uiapplicationshortcuticon iconwithtemplateimagename:@“标签.png”];
uiapplicationshortcuticon *cameraicon = [uiapplicationshortcuticon iconwithtype:uiapplicationshortcuticontypecompose];
uiapplicationshortcutitem *cameraitem = [[uiapplicationshortcutitem alloc] initwithtype:@“one” localizedtitle:@“拍照” localizedsubtitle:@“” icon:cameraicon userinfo:nil];
uiapplicationshortcuticon *shareicon = [uiapplicationshortcuticon iconwithtype:uiapplicationshortcuticontypeshare];
uiapplicationshortcutitem *shareitem = [[uiapplicationshortcutitem alloc] initwithtype:@“two” localizedtitle:@“分享” localizedsubtitle:@“” icon:shareicon userinfo:nil];
/** 将items 添加到app图标 */
application.shortcutitems = @[cameraitem,shareitem];
}
最后在代理方法里面实现具体需求代码
[objc] view plain copy-(void)application:(uiapplication *)application performactionforshortcutitem:(uiapplicationshortcutitem *)shortcutitem completionhandler:(void (^)(bool))completionhandler
{
uinavigationcontroller *nav = (uinavigationcontroller *)self.window.rootviewcontroller;
if([shortcutitem.type isequaltostring:@“one”]){
uiviewcontroller *vc = [[uiviewcontroller alloc] init];
vc.title = @“第一个”;
vc.view.backgroundcolor = [uicolor redcolor];
[nav pushviewcontroller:vc animated:yes];
}else if ([shortcutitem.type isequaltostring:@“two”]){
uiviewcontroller *vc = [[uiviewcontroller alloc] init];
vc.title = @“第二个”;
vc.view.backgroundcolor = [uicolor greencolor];
[nav pushviewcontroller:vc animated:yes];
}
}
二、应用内ui界面用力按下产生的3dtouch效果(这种方式也有两种实现效果)
1、比如用力按下某个cell,弹出预览的小视图,同时上滑底部出现若干个选项(peek功能)
首先注册需要实现touch效果的view,判断下设备系统支不支持,不然会崩溃
把当前的cell注册绑定,然后试图界面实现uiviewcontrollerpreviewingdelegate代理
[objc] view plain copy#pragma mark - uiviewcontrollerpreviewingdelegate
-(uiviewcontroller *)previewingcontext:(id《uiviewcontrollerpreviewing》)previewingcontext viewcontrollerforlocation:(cgpoint)location
{
nsindexpath *index = [self.tableview indexpathforcell:(uitableviewcell *)[previewingcontext sourceview]];
newslistmodel *model = self.lists[index.row];
newsdetailsviewcontroller *showvc = [[newsdetailsviewcontroller alloc]init];
showvc.newsid = model.news_id;
cgrect rect = cgrectmake(0, 0, previewingcontext.sourceview.ab_width, previewingcontext.sourceview.ab_height);
previewingcontext.sourcerect = rect;
return showvc;
}
到这里就能有弹出预览界面效果了,如果还是实现下面的几个选项功能,需要在你预览界面里面实现一个方法:
[objc] view plain copy- (nsarray《id《uipreviewactionitem》》 *)previewactionitems
{
uipreviewaction *action0 = [uipreviewaction actionwithtitle:@“action0” style:uipreviewactionstyledefault handler:^(uipreviewaction * _nonnull action, uiviewcontroller * _nonnull previewviewcontroller) {
nslog(@“%s, line = %d, action0 = %@, previewviewcontroller = %@”, __function__, __line__, action, previewviewcontroller);
}];
uipreviewaction *action1 = [uipreviewaction actionwithtitle:@“action1” style:uipreviewactionstyledestructive handler:^(uipreviewaction * _nonnull action, uiviewcontroller * _nonnull previewviewcontroller) {
nslog(@“%s, line = %d, action1 = %@, previewviewcontroller = %@”, __function__, __line__, action, previewviewcontroller);
}];
uipreviewaction *action2 = [uipreviewaction actionwithtitle:@“action2” style:uipreviewactionstyleselected handler:^(uipreviewaction * _nonnull action, uiviewcontroller * _nonnull previewviewcontroller) {
nslog(@“%s, line = %d, action2 = %@, previewviewcontroller = %@”, __function__, __line__, action, previewviewcontroller);
}];
uipreviewaction *action3 = [uipreviewaction actionwithtitle:@“action3” style:uipreviewactionstyleselected handler:^(uipreviewaction * _nonnull action, uiviewcontroller * _nonnull previewviewcontroller) {
nslog(@“%s, line = %d, action2 = %@, previewviewcontroller = %@”, __function__, __line__, action, previewviewcontroller);
}];
//该按钮可以是一个组,点击该组时,跳到组里面的按钮。
uipreviewactiongroup *actiongroup = [uipreviewactiongroup actiongroupwithtitle:@“actiongroup” style:uipreviewactionstyleselected actions:@[action2, action3]];
//直接返回数组。
return @[action0,action1,actiongroup];
}
2、在第1个效果的基础上,再继续用力按下去,就会push预览界面了。(pop功能)
再实现一个代理方法
[objc] view plain copy#pragma mark - uiviewcontrollerpreviewingdelegate
-(void)previewingcontext:(id《uiviewcontrollerpreviewing》)previewingcontext commitviewcontroller:(uiviewcontroller *)viewcontrollertocommit
{
[self showviewcontroller:viewcontrollertocommit sender:self];
}
这样就能直接puhs想要的界面了。

一般在设计中双面板是先走信号线还是先走地线?
乐普医疗在心血管医疗器械领域国际化创新发展宏图之路
Kubernetes架构和核心组件组成 Kubernetes节点“容器运行时”技术分析
【设计技巧】你掌握了吗?在PCB设计中,又快又准地放置元件
FPGA有什么优势,可以让FPGA替代GPU吗
3dtouch技术原理_3dtouch是怎么实现的?
想做好电路板,一定要知道的软硬结合板设计要点
无线倒车雷达保护器件和方案
N2X与IXIA硬件平台融合方案
AMS推出18通道多光谱传感器解决方案 为光谱传感应用带来更多想象空间
TI推出业内首款集成四通道和双通道射频采样收发器,实现多天线宽带系统
CMOS型单片机时钟电路图
H.264/AVC中量化的Verilog方法介绍及实现
小米集团公布新一轮组织架构调整
半导体企业兆易创新发布2021年报
已有两款iPhone被测出辐射超标
Agilent N7744A多端口光功率计的性能技术指标
水质在线监测用哪些仪器好?浮标在线监测微型水质监测站了解下
氢燃料电池车发展虽快,但还存在技术瓶颈
32768晶振封装尺寸详解