引言

With iOS 9, new iPhone models add a third dimension to the user interface.

  • A user can now press your Home screen icon to immediately access functionality provided by your app.
  • Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.

模拟器实现3D Touch功能

1、插件安装

插件下载地址:
https://github.com/DeskConnect/SBShortcutMenuSimulator

  • 下载插件到本地(在terminal操作):

    git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git

     
  • 安装插件:
    cd SBShortcutMenuSimulator
    make

     

2、插件使用

  • 启动插件

    xcrun simctl spawn booted launchctl debug system/com.apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD/SBShortcutMenuSimulator.dylib
    xcrun simctl spawn booted launchctl stop com.apple.SpringBoard

    注意:如果运行过程中出现:No devices are booted. 是因为你的模拟器没有启动,这时候启动你的模拟器即可。

  • 预览效果

    echo 'com.apple.mobilecal' | nc 127.0.0.1 8000

    注意:
    1、'com.apple.mobilecal'是应用的Bundle ID,如果你要测试自己的应用的3D Touch效果,将该字段换成自己应用的Bundle ID。上面的示例应用是系统日历。
    2、如果出现SpringBorad意外退出,可能是你的模拟器高于iOS9.1,可以尝试下载iOS9.1或iOS9.0的模拟器然后重新以上“插件使用”操作。

检测是否支持3D Touch

  • 在UIViewController生命周期的viewWillAppear中做判断:

    -(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
    //3D Touch可用
    }
    else{
    //3D Touch不可用
    }
    }

    UIForceTouchCapability是个枚举

    @property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability NS_AVAILABLE_IOS(9_0);
    
    typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
    UIForceTouchCapabilityUnknown = 0, //3D Touch检测失败
    UIForceTouchCapabilityUnavailable = 1, //3D Touch不可用
    UIForceTouchCapabilityAvailable = 2 //3D Touch可用
    };
  • 也可以通过以下方法实现判断,当界面环境发生改变时会调用该方法:
    -(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    if (previousTraitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
    NSLog(@"3D Touch可用");
    }
    else{
    NSLog(@"3D Touch不可用");
    }
    }

3D Touch开发

iOS9提供了四类API(Home Screen Quick Action、UIKit Peek & Pop 、WebView Peek & Pop 和UITouch Force Properties)用于操作3D Touch(Pressure Sensitivity 、 Peek and Pop 和 Quick Actions)。

1、Home Screen Quick Actions

  用力按压主屏幕的应用Icon,可以通过3D Touch呼出一个快捷菜单,点击快速进入相关功能模块。

  

 
  

  其中系统自带的图片有以下类型:

typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {
UIApplicationShortcutIconTypeCompose,
UIApplicationShortcutIconTypePlay,
UIApplicationShortcutIconTypePause,
UIApplicationShortcutIconTypeAdd,
UIApplicationShortcutIconTypeLocation,
UIApplicationShortcutIconTypeSearch,
UIApplicationShortcutIconTypeShare,
UIApplicationShortcutIconTypeProhibit NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeContact NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeHome NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeMarkLocation NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeFavorite NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeLove NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeCloud NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeInvitation NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeConfirmation NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeMail NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeMessage NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeDate NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeTime NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeCapturePhoto NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeCaptureVideo NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeTask NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeTaskCompleted NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeAlarm NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeBookmark NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeShuffle NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeAudio NS_ENUM_AVAILABLE_IOS(9_1),
UIApplicationShortcutIconTypeUpdate NS_ENUM_AVAILABLE_IOS(9_1)
} NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;
创建Quick Action有两种方式:静态和动态
  • 静态创建
    静态创建只需在Info.plist上添加相关功能设置:

    也可以右击Info.plist -> Open As -> Source Code,输入:

    <key>UIApplicationShortcutItems</key>
    <array>
    <dict>
    <key>UIApplicationShortcutItemIconType</key>
    <string>UIApplicationShortcutIconTypeSearch</string>
    <key>UIApplicationShortcutItemSubtitle</key>
    <string>搜索好友</string>
    <key>UIApplicationShortcutItemTitle</key>
    <string>搜索</string>
    <key>UIApplicationShortcutItemType</key>
    <string>1</string>
    <key>UIApplicationShortcutItemUserInfo</key>
    <dict/>
    </dict>
    <dict>
    <key>UIApplicationShortcutItemIconType</key>
    <string>UIApplicationShortcutIconTypeAdd</string>
    <key>UIApplicationShortcutItemSubtitle</key>
    <string>添加好友</string>
    <key>UIApplicationShortcutItemTitle</key>
    <string>添加</string>
    <key>UIApplicationShortcutItemType</key>
    <string>2</string>
    <key>UIApplicationShortcutItemUserInfo</key>
    <dict/>
    </dict>
    </array>
  • 动态创建
    代码创建3D Touch的item:
    UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"3" localizedTitle:@"扫一扫"];
    UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"3DSearch"];
    UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"4" localizedTitle:@"设置" localizedSubtitle:nil icon:icon userInfo:nil];
    [UIApplication sharedApplication].shortcutItems = @[item1,item2];

    创建方法:

    -(instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
    -(instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;

    设置图片方法:

    +(instancetype)iconWithType:(UIApplicationShortcutIconType)type;
    +(instancetype)iconWithTemplateImageName:(NSString *)templateImageName;

  注意:
  (1)系统限制每个App最多能够显示4个Action Item,其中包括静态方式和动态方式进行创建的,超过个数不显示。
  (2)如果静态和动态方式同时使用的时候,给UIApplication的shortcutItems赋值的时候不会覆盖静态创建的items。
  (3)动态创建的方式只有在程序第一次启动之后才会显示。
  (4)如果你要显示系统图片时,info.plist中不要添加UIApplicationShortcutItemIconFile属性,因为当UIApplicationShortcutItemIconFile和UIApplicationShortcutItemIconType同时存在时,会优先使用UIApplicationShortcutItemIconFile设置的图片。

  (5)Quick Actions显示的icon在左边或者右边,这个是跟你的app 放在你手机的位置有关系,这个iOS会自动处理掉。

点击Home Screen Quick Actions的相应回调
  • iOS9新增以下方法实现点击 Home Screen Quick Action的相应回调,我们可以通过shortcutItem的type或者localizedTitle属性(因为这两个属性时必须设置的)判断点击了哪个item:

    -(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler {
    NSInteger index = shortcutItem.type.integerValue;
    switch (index) {
    case 1:
    NSLog(@"搜索");
    break;
    case 2:
    NSLog(@"添加");
    break;
    case 3:
    NSLog(@"扫一扫");
    break;
    case 4:
    NSLog(@"设置");
    break;
    default:
    break;
    }
    }
  • 还可以通过入口方法里面进行判断(该方法只会在程序从未启动到启动过程中才会被调用):

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
      if (launchOptions) {
    UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
    NSInteger index = item.type.integerValue;
    switch (index) {
    case 1:
    NSLog(@"搜索");
    break;
    case 2:
    NSLog(@"添加");
    break;
    case 3:
    NSLog(@"扫一扫");
    break;
    case 4:
    NSLog(@"设置");
    break;
    default:
    break;
    }
    } return YES;
    }

2、Peek & Pop

A peek :
Appears while a user presses on an item that supports peek and disappears when the user’s finger lifts
Opens a detailed view of the item—called a pop—when users press a little deeper on the peek view
Can provide quick actions related to the item when users swipe up within the peek view

                      

 
 
UIKit Peek & Pop
  • 给ViewController上的view注册3D Touch(先判断设备是否支持3D Touch)

    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
    {
    [self registerForPreviewingWithDelegate:(id)self sourceView:self.view]; }
  • 新建一个新的UIViewController名为:ContentViewController,以便之后peek时显示该ContentViewController,在ContentViewController中重写以下方法实现Quick actions:

    -(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:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
    NSLog(@"action2");
    }];
    NSArray *actions = @[action1,action2];
    UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:actions];
    NSArray *array = @[group1];
    return array;
    }

    注意:
    1、该方法不是必须要重写,根据自己的需求而定。
    2、这里是把两个action放在了一个组里显示,也可以直接显示两个action。

  • ViewController遵循UIViewControllerPreviewingDelegate协议:

    //UIViewControllerPreviewingDelegate
    //稍微重按调用该方法:(peek)
    -(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    //防止重复加入
    if ([self.presentedViewController isKindOfClass:[ContentViewController class]]){
    return nil;
    }
    else {
    ContentViewController *contentVC = [[ContentViewController alloc] init];
    return contentVC;
    }
    }
    //加重按压调用该方法:(pop)
    -(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    //跳转到某个ViewController
    ContentViewController *contentVC = [[ContentViewController alloc] init];
    [self.navigationController pushViewController : contentVC animated:YES];
    }
  • 效果图:
                   
     
                   
WebKit Peek & Pop

  WebKit Peek & Pop 的操作和UIKit差不多,只是显示的是Web网页。
  显示网页有三种方法:
  1、openUrl离开应用进入safari打开网页
  2、UIWebView或者WKWebView自定义视图在应用内打开网页
  3、在iOS9.0后新增SFSafariViewController类,用于显示web网页。并通过SFSafariViewControllerDelegate的以下方法实现回到应用操作。

-(void)safariViewControllerDidFinish:(SFSafariViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}

  注意:
  1、方法1不能实现3D Touch。
  2、使用方法2实现3D Touch时,要设置属性 allowsLinkPreview 为Yes(默认是NO)。

参考文档

http://pingguohe.net/2015/10/12/3D-Touch-2.html
     http://www.devzeng.com/blog/ios9-3d-touch.html

初学3D Touch的更多相关文章

  1. iOS 3D Touch实践

    本文主要讲解3DTouch各种场景下的开发方法,开发主屏幕应用icon上的快捷选项标签(Home Screen Quick Actions),静态设置 UIApplicationShortcutIte ...

  2. iOS 3D Touch 适配开发

    3D Touch的主要应用 文档给出的应用介绍主要有两块: 1.A user can now press your Home screen icon to immediately access fun ...

  3. 从3D Touch 看 原生快速开发

    全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...

  4. 3D touch在Unity3D中的使用

    0.开篇: 3D touch随着iOS9发布,它并不是一个单独的技术,而是可以分为pressure sensitivity.quick action以及peek&pop.在官方的介绍中提到可以 ...

  5. 3D Touch介绍:电子秤App与快捷操作

    随着iPhone6s与6s plus的到来,苹果给我们展现了一种全新的交互方式:重按手势.你可能知道,这个特性已经在Apple Watch和MacBook上推出了,不过那时叫Force Touch,就 ...

  6. iOS 3D touch 使用技巧

    第一个 在桌面中3d Touch 打开菜单 由于本人纯属代码党,本次实现方法也只使用代码实现 到达到这个效果并不难,只需要在appdelegate中实现以下代码即可 ,当然也有缺点,就是这个app没运 ...

  7. 3D Touch

    一.认识3D Touch   1.硬件和操作系统要求      iPhone 6s或者iPhone 6s Plus      操作系统要求 ios9+ 2.3D Touch的交互效果 QuickAct ...

  8. 3D touch的 使用心得

    一.设置图标touch 快捷进入 1.静态标签 静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序会在动态标签的前面. 我们先来看静态标签的配置: 首先,在in ...

  9. 3D Touch集成过程整理

    1.集成App图标按压快速打开某个功能 在AppDelegate.m中加入以下三个东西 在启动方法里加入3D Touch菜单 - (BOOL)application:(UIApplication *) ...

随机推荐

  1. Failed to load resource: the server responded with a status of 500 (Internal Server Error)

    错误提示: 原因: MIME类型错误. 之前添加json.woff.woff2映射,更换系统(Win7升Win10)后配置失效,在webconfig中删除映射即可,因为Win10自带上面3个MIME映 ...

  2. DAL.SQLHelper 的类型初始值设定项引发异常的处理

    这是DAL.SQLHelper的类中定义了sql连接字符串,但是在web.config中没有定义,在类判断获取的字符串是否为空,或是在web.config添加相应的连接字符串.

  3. php curl_init函数用法

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网 页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并 ...

  4. [MVC_Json序列化]Json字符串反序列化成C#对象

    上一篇中有Json序列化相关问题得到了解决. 那么结果集为Json串时,如何将Json串转成C#对象呢? 现举例说明: -现有如下字符串数据 string k = "{\"ring ...

  5. hdu4273Rescue(三维凸包重心)

    链接 模板题已不叫题.. 三维凸包+凸包重心+点到平面距离(体积/点积)  体积-->混合积(先点乘再叉乘) #include <iostream> #include<cstd ...

  6. 【Hector slam】A Flexible and Scalable SLAM System with Full 3D Motion Estimation

    作者总结了SLAM前端和后端的区别 While SLAM frontends are used to estimate robot movement online in real-time, the ...

  7. spring boot给http添加正向代理

    http://blog.csdn.net/jaune161/article/details/44198599http://46aae4d1e2371e4aa769798941cef698.devpro ...

  8. lua特性纪要

    [局部变量] lua的局部变量通过local进行显示声明, 其作用域仅限于声明它的块block.这里的block分为三种类型: 1.控制结构的执行体 2.函数的执行体 3.chunk 比较容易引起混淆 ...

  9. RedHat下安装Telnet服务端及客户端远程连接配置

    Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力. 配置之前请确保网络连通,如防火墙影响连接,请先关 ...

  10. ubuntu静态DNS配置,重启继续生效

    搞linux上网是件很闹心的事情,更有些闹心的在于毛线DNS在重启之后就木有了,写在/etc/resolv.conf文件中的,后来发现在文件中丫是这样写的: # Dynamic resolv.conf ...