3DTouch

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];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值