iOS开发-3D Touch简要总结

原创 2016年09月25日 22:48:54

3D Touch是iOS9推出的适用于iPhone6s(Plus),包括刚出的iPhone7(Plus)以上的机型的功能。
开发主要有4个方面:
- 主界面快捷菜单功能 (Home screen quick action)
- 预览图和重击功能( UIKit Peek and Pop)
- Web view预览链接的页面(Web view peek and pop)
- 检测3D Touch的相对压力大小(UITouch force properties)

主界面快捷菜单功能(Home Screen Quick Actions)类似电脑右键菜单

Quick Actions
有一个快捷菜单类UIApplicationShortcutItem
UIApplicationShortcutItem类有几个属性参数:
- type 必须的,自定义的类型参数
- localizedTitle 必须的,标题
- localizedSubtitle 可选的,子标题
- icon 可选的,可以用系统的或者自定义,注意自定义的图片必须有透明区域(不然图片是一片黑色),且大小有限制(35*35个点)。
- userInfo 可选的, 该选项携带的字典数据。

添加快捷菜单有两种方式:
1.在info.plist添加UIApplicationShortcutItems

<array>
    <dict>
        <key>UIApplicationShortcutItemIconType</key>
           <string>UIApplicationShortcutIconTypeSearch</string>
           <key>UIApplicationShortcutItemSubtitle</key>
           <string>shortcutSubtitle1</string>
           <key>UIApplicationShortcutItemTitle</key>
           <string>shortcutTitle1</string>
           <key>UIApplicationShortcutItemType</key>
           <string>$(PRODUCT_BUNDLE_IDENTIFIER).First</string>
           <key>UIApplicationShortcutItemUserInfo</key>
           <dict>
             <key>firstShorcutKey1</key>
             <string>firstShortcutKeyValue1</string>
           </dict>
    </dict>
</array>

2.application:didFinishLaunchingWithOptions方法后面添加给[UIApplication sharedApplication].shortcutItems赋值;

-(void)createShortcutItems{
    //自定义图片要透明的才会有图案,不然是黑色一片
    UIApplicationShortcutItem* item1 = [self createShortcutItemWithTitle:@"拍照" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCapturePhoto]];
    UIApplicationShortcutItem* item2 = [self createShortcutItemWithTitle:@"联系人" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeContact]];
    UIApplicationShortcutItem* item3 = [self createShortcutItemWithTitle:@"美化" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"美化"]];
    UIApplicationShortcutItem* item4 = [self createShortcutItemWithTitle:@"任务" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeTask]];
    [UIApplication sharedApplication].shortcutItems = @[item1,item2,item3,item4];
}

-(UIApplicationShortcutItem *)createShortcutItemWithTitle:(NSString *)title icon:(UIApplicationShortcutIcon *)icon{
   return [[UIApplicationShortcutItem alloc]initWithType:title
                                          localizedTitle:title
                                       localizedSubtitle:nil
                                                    icon:icon
                                                userInfo:nil];
}

application:performActionForShortcutItem:completionHandler:方法里监测3D Touch菜单按钮的点击

-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
    NSArray<NSString *> *itemsNames = @[@"拍照", @"联系人", @"美化",@"任务"];
    NSUInteger index = [itemsNames indexOfObject:shortcutItem.localizedTitle];
    NSLog(@"%@",itemsNames[index]);
   }
}

注意点:
- 自定义图片要透明的才会有图案,不然是黑色一片。
- 如果application:didFinishLaunchingWithOptions返回NO则 application:performActionForShortcutItem:completionHandler 方法不执行。
- APP加载完可能没有执行相应的3D Touch菜单相应的动作,可在application:performActionForShortcutItem:completionHandler等待主界面加载完再做相应的动作,简单点就延时0.1秒就可以了。
- 如需在app 内部改变3D Touch的菜单选项,可以用UIMutableApplicationShortcutItem 类可以改变快捷菜单内容(在info.plist设置的不可改变)。

官方swift写的3D Touch快捷菜单例子

预览图和重击功能(Peek and Pop)

有三个控制器:1当前控制器 2预览图控制器 3重击时跳转的控制器(也可以不实现,跳回到第一个控制器)
在当前控制器实现代理UIViewControllerPreviewingDelegate;
实现代理中的两个方法分别对应Peek和Pop;

首先监测3D Touch功能是否可用 (可用的话就注册代理UIViewControllerPreviewingDelegate)

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
        [self registerForPreviewingWithDelegate:self sourceView:self.tableView];
    }
}

实现Peek预览功能

-(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:location];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    self.indexPath = indexPath;
    if (!cell) {
        return nil;
    }
    previewingContext.sourceRect = cell.frame;//突出来的frame,见下图
    ZSRPreviewController *vc = [[ZSRPreviewController alloc] init];//预览图控制器
    vc.preferredContentSize = CGSizeMake(kScreenWidth, 200);
    vc.index = [indexPath row];
    return vc;
}

实现Pop重击功能

-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    [self tableView:self.tableView didSelectRowAtIndexPath:self.indexPath];
}

Peek开始

在预览图控制器覆盖以下方法有具体的选项功能。

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"确定" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"确定");
    }];
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"取消" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"取消");
    }];
    NSArray *actions = @[action1,action2];
    return actions;
}

这里写图片描述

官方swift写的3D Touch预览图例子

Web view预览链接的页面(Web view peek and pop)

非常简单,只需要加上 webView.allowsLinkPreview = YES; 就可以实现该功能了。

这里写图片描述

3D Touch的相对压力大小(UITouch force properties)

UITouch 有个force属性,可以根据这个检测3D Touch的相对力度大小。
官方swift写的例子:根据按压力度不同改变画笔的宽度

参考官方文档
画板

附上自己写的OC例子

版权声明:本文为博主原创文章,转载说明出处

3D Touch 的实现和系统分享功能

3D Touch其实就是快速进入指定app界面的一种方式。 下面和大家分享一下简单的实现 1、静态标签 静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序...
  • yishengzhiai005
  • yishengzhiai005
  • 2016年12月07日 15:30
  • 1829

IOS开发之 一起用Swift来玩一玩3D Touch

Swift 2.3 IOS 8.0 XCode 8.0 添加入口标签在这里只说下静态的好了,暂时还用不到动态的,e.g.UIApplicationShortcutItems ...
  • sbt0198
  • sbt0198
  • 2017年02月07日 14:45
  • 966

模拟器使用3D Touch功能

在模拟器上学习和测试3D Touch    3D Touch是一个很新颖的设计,可是苹果文档有言: With Xcode 7.0 you must develop on a dev...
  • jinglijun
  • jinglijun
  • 2015年12月06日 16:12
  • 3777

关于3D Touch从app图标快速入口篇.

一: 让模拟器可以测试3D Touch的快速入口效果步骤(本人也是在github上发现的方法,再次总结一下):  模拟器测试3D Touch的方法  1. 打开终端  2. git clon...
  • u011103672
  • u011103672
  • 2015年09月25日 17:20
  • 1323

3DTouch在Unity游戏开发中的一个坑

起因  游戏测试过程中有这样一个反馈, 按住控制角色行走, 当按住触摸屏幕左铡边缘部位时, 有时会有1秒左右的延迟. 很是影响游戏的体验. 多次测试后, 具体表现为 表现 1. 支持3DTouch的设...
  • rct1985
  • rct1985
  • 2016年11月11日 11:41
  • 1016

手把手教你如何实现3D Touch

很久之前就想写一篇关于3D Touch的博客,因为各种原因一直到现在才开始写(其实就是懒>_...
  • wangkun_510
  • wangkun_510
  • 2015年10月29日 16:19
  • 1383

3D Touch开发之App 快速入口标签(快捷菜单)

一、简介:自从苹果公司引入了 3D Touch 功能后,众多开发者,也开在自己的app上实现自己的 3D Touch 效果,今天我也来小秀一把。我们先来看看,3D Touch 下的 app 快速启动入...
  • zhengang007
  • zhengang007
  • 2015年12月16日 11:45
  • 1432

IOS实现3DTouch功能

赶需求期间,想着别人应用都搞起3DTouch功能了,咱也来装逼一会,凸显下逼格。 废话少说,先搜索了前人的热心奉献,自己再动手丰衣足食,下面归纳总结下。 首先,想要体验3DTouch功能,必须至少得是...
  • a416863220
  • a416863220
  • 2016年04月22日 10:35
  • 8624

3Dtouch 基本原理

UIApplicationShortcutItems即用3Dtouch在app图标呼出一个菜单       实现由两种方法:静态菜单和动态菜单   静态菜单是在plist中添加,...
  • c386890506
  • c386890506
  • 2016年03月14日 14:26
  • 893

3DTouch桌面快捷方式

3DTouch是iOS9,iPhone6s上新加的功能,之前只是一直有了解,但是由于设备的原因并没有很好的研究,后来购入一台6S所以就迫不及待的尝试了一下。 申明Quick Action有两种...
  • xa846213981
  • xa846213981
  • 2016年03月17日 10:08
  • 517
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发-3D Touch简要总结
举报原因:
原因补充:

(最多只允许输入30个字)