3DTouch

来源:互联网 发布:python难找工作 编辑:程序博客网 时间:2024/05/22 12:55

3DTouch是iOS9出的新特性,用户可以在手机主屏幕和app内部使用

1. 主屏幕的快捷操作

当用户按压应用图标是会弹出快捷操作列表,当用户选择选择一个快捷操作是,应用会被激活或者启动,同事你的代理对象会收到快捷操作的信息。

image: ../Art/maps_directions_home_2x.png

  • 固定的快捷操作:需要在Info.plist里设置 UIApplicationShortcutItems
  • 动态的快捷操作:需要使用UIApplicationShortcutItem类和相关方法创建快捷操作,并设置UIApplicationshortcutItems的属性

2. 应用内使用

当用户按压时会经历三个阶段:

  • 看看内容预览是否有效
  • 展示预览内容
  • present出内容预览页面

image: ../Art/preview_available_2_2x.png

image: ../Art/peek_2x.png

image: ../Art/peek_quick_actions_2x.png

3. 使用

  • 检查3D-Touch是否可用
//通过forceTouchCapability属性判断3DTousch是否可用 //UIForceTouchCapabilityUnknown、UIForceTouchCapabilityUnavailable、UIForceTouchCapabilityAvailable//实现UITraitEnvironment协议的类都可以直接调用,UIScreen、UIWindow、UIViewController、UIView都实现了该协议if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){  NSLog(@"可用");}//重写该方法可以监听状态改变改变- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection如果3DTouch不可用需要自己写 UILongPressGestureRecognizer来代替
  • 主屏幕快捷操作—固定的快捷操作

    需要在Info.plist文件中添加UIApplicationShortcutItems

    这里写图片描述

    UIApplicationShortcutItemType快捷操作的类型,需要这个识别快捷操作

    UIApplicationShortcutItemTitle快捷操作的标题

    UIApplicationShortcutItemSubtitle快捷操作的子标题

    UIApplicationShortcutItemIconType快捷操作的图标

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  // Override point for customization after application launch.//如果程序被杀掉,在这里拿到快捷操作  if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){      UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];      if(shortcutItem){          //根据type判断要指定哪个操作      }  }  return YES;}//设置完plist文件后需要在appdelegate中重写该方法- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {//根据type来判断执行不同的操作  if([shortcutItem.type isEqualToString:@"search"]){      NSLog(@"search");  }else if([shortcutItem.type isEqualToString:@"open"]){      NSLog(@"open");  }  completionHandler(YES);}

  • 主屏幕快捷操作——— 动态的快捷操作

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  // Override point for customization after application launch.  if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){      UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];      if(shortcutItem == nil){          UIApplicationShortcutItem *firstItem = [[UIApplicationShortcutItem alloc] initWithType:@"first" localizedTitle:@"第一个" localizedSubtitle:@"子标题" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun1"] userInfo:nil];          UIApplicationShortcutItem *secondItem = [[UIApplicationShortcutItem alloc] initWithType:@"second" localizedTitle:@"第二个" localizedSubtitle:@"子标题" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun2"] userInfo:nil];          application.shortcutItems = @[firstItem,secondItem];      }else{          //根据type判断要指定哪个操作      }  }  return YES;}//自定义图标需要正方形,单一颜色,35*35的图才可以使用
  • 应用内使用

    应用内使用3DTouch需要使用 UIPreviewActionUIPreviewActionGroup类以及 UIPreviewActionItem协议

- (void)viewDidLoad {    [super viewDidLoad];    _imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];    _imgView.center = self.view.center;    _imgView.image = [UIImage imageNamed:@"sun"];    _imgView.userInteractionEnabled = YES;    [self.view addSubview:_imgView];    //先判断3DTouch是否可用    if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){        //注册,首先是一个代理,sourceView是你需要将3DTouch加到的view上        [self registerForPreviewingWithDelegate:self sourceView:_imgView];    }}//实现代理方法#pragma UIViewControllerPreviewingDelegate- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {    //location是按压在应用3DTouch视图上的位置    //设置sourceRect,应用3DTouch视图的bounds    previewingContext.sourceRect = _imgView.bounds;    //这是需要弹出的controller    DetailViewController *detailVC = [[DetailViewController alloc] init];    //预览是后的大小    detailVC.preferredContentSize = CGSizeMake(0, 300);    return detailVC;}- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {    //present预览的controller    [self showViewController:viewControllerToCommit sender:self];}//这是再DetailViewController.m文件中的重写的,当弹出预览时,上滑预览视图,出现预览视图中快捷选项- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {        NSLog(@"action1");    }];    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {        NSLog(@"action2");    }];    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {        NSLog(@"action3");    }];    return @[action1,action2,action3];}
原创粉丝点击