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例子

版权声明:本文为博主原创文章,转载说明出处 https://blog.csdn.net/scaulaughter/article/details/52665081

IOS 3D Touch 开发教程

前一阵子伴随着苹果发布新产品iPhone6s 和 IOS9新系统,一系列关于硬件和软件的新功能、新特性逐渐进入iPhone用户的视线。这次我们就来讲讲传闻已久的3D Touch。          当...
  • He_jiabin
  • He_jiabin
  • 2016-03-02 12:17:24
  • 3037

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

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

IOS实现3DTouch功能

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

iOS开发之3DTouch集成

静态添加入口标签在info.plist中添加如图所示 各项都代表的意思首先是UIApplicationShortcutItems,他是一个数组类型,数组中的每一个元素表示一个入口标签。然后是Item...
  • sinat_30162391
  • sinat_30162391
  • 2016-04-08 13:51:34
  • 1793

在xcode模拟器上运行3Dtouch

第一步, git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git cd SBSho...
  • hurosezhang
  • hurosezhang
  • 2016-08-15 15:52:17
  • 1715

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

经过最近几天的研究,本人已经做出了一套快速入口的小demo,并且可以让模拟器进行3D Touch的快速入口效果. 一: 让模拟器可以测试3D Touch的快速入口效果步骤(本人也是在gi...
  • wave2588
  • wave2588
  • 2015-09-23 15:00:12
  • 1729

3D touch 静态、动态设置及进入APP的跳转方式

申明Quick Action有两种方式:静态和动态 静态是在info.plist文件中申明,动态则是在代码中注册,系统支持两者同时存在。 -系统限制每个app最多显示4个快捷图标,包括静态和动态 静态...
  • y2888886
  • y2888886
  • 2016-11-29 15:09:21
  • 848

iOS10 widget实现,3Dtouch 弹出菜单

文章将依次从以下几个问题着手,进行详细说明: 1、如何为现有的工程添加widget; 2、如何绘制UI; 3、如何调起app; 4、如何与host app共享数据。 图2 添...
  • SHTLoveXX
  • SHTLoveXX
  • 2016-12-19 13:55:02
  • 1967

iOS 3D Touch开发tableview页面内的使用

上一次写了3DTouch在app icon的使用,时间隔了那么久,其实我早就写完了····就是一直忙着没时间 发表文章分享,也是对不住了~ 这篇文章讲的是3DTouch在页面内的使用  首先声明  c...
  • werctzzz
  • werctzzz
  • 2015-12-30 10:56:16
  • 1872
收藏助手
不良信息举报
您举报文章:iOS开发-3D Touch简要总结
举报原因:
原因补充:

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