【iOS】3DTouch初步学习

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
3D Touch效果

注意:
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呼出一个快捷菜单,点击快速进入相关功能模块。


Map Home Screen Quick Actions

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

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

A peek preview in Safari
Quick actions in a Safari peek
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];
}
  • 效果图:


    peek

    Quick actions

    点击Action Group

    pop
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 前言 关于3D touch苹果官方文档是这么开始介绍的: 大意如下:iOS9开始,所有新的手机都增加了一个三维的用...
    VV木公子阅读 2,193评论 3 39
  • 前言 关于这篇文章 由于iPhone 6S发布不到一年的时间,很多新特性、新技术还未普遍,不管是3D Touch的...
    Tangentw阅读 4,445评论 8 18
  • 3D Touch简介 2015年,苹果发布了iOS9以及iphone6s/iphone6s Plus,其中最具有创...
    爱恨的潮汐阅读 382评论 0 2
  • 专著:http://www.jianshu.com/p/3443a3b27b2d 1.简单的介绍一下3D Touc...
    violafa阅读 999评论 1 0
  • 3D Touch简介 2015年,苹果发布了iOS9以及iphone6s/iphone6s Plus,其中最具有创...
    简简蜗牛阅读 598评论 0 0