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

3G基础知识

5人已加入

描述

  什么是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文件静态设置

  3DTouch

  [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,判断下设备系统支不支持,不然会崩溃

  3DTouch

  把当前的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想要的界面了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分