苹果是在iphone6s开始加入的3DTouch功能.也就是说是ios9开始加入的3DTouch.3DTouch也就是根据你手按压的力度大小来触发的.


	3DTouch具体有两种表现形式.第一种是在Launch页面,也就是在苹果的桌面上.就算我们不做关于3DTouch的任何集成.在上线的项目中(注:一定是上线的项目,Debug之类的是没有任何显示的)也有一个关于分享的3DTouch按钮

3d ios touch 开发 iphone 3d touch怎么开_ico

这个就是苹果系统给我们弄上去的.那么如果我们想加一个自己的应该怎么弄呢.

###桌面的3DTouch
对于桌面版的3DTouch.也是两种方式.
1.使用plist文件,这个其实有点恶心,那个键值对其实在plist里面查找不到.我们需要手动添加以下的字段.

UIApplicationShortcutItems(NSArray),这个其实也可以猜出来.毕竟是Items.

array的每一个元素都是以NSDictionry形式存在的,因为每一个小cell都有不同的标题,副标题,图片嘛.
	UIApplicationShortcutItemType: 快捷可选项的特定字符串(必填)

键值

作用

UIApplicationShortcutItemTitle

快捷可选项的标题(必填)

UIApplicationShortcutItemSubtitle

快捷可选项的子标题(可选)

UIApplicationShortcutItemIconType

快捷可选项的图标(可选)

UIApplicationShortcutItemIconFile

快捷可选项的自定义图标(可选)

UIApplicationShortcutItemUserInfo

快捷可选项的附加信息(可选)

当你点击桌面的shortcutItem之后,系统会调用
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    if ([shortcutItem.type isEqualToString:@"xxx"]) {//因为我们注册Item的时候就使用了不同的Type,我们可以判断shortcutItem的type来做不同的事情.如果不写代码默认是跳转进入APP

    }
}
我来简单的描述一下跳转逻辑,对于3DTouch这种特殊的需要在APP界面外调用的功能来说.调试的时候就需要开放一下想象力.
	这样来思考一下,当你把QQ杀死之后.重新进入QQ.走的是applicationdidfinshlaunch.这个我们是知道的.纯代码设置window的rootviewcontroller也是在这个方法里面设置的,这个我们也是知道的.如果我们没有设置rootviewcontroller的话,程序就不会有主界面.就是一黑色的window(我一般喜欢把window设置成白色的).如果我们把QQ杀死,使用的是QQ的3DTouch进入比如扫一扫.就会进入相应的页面.如果没有走finishLaunch的话界面都没有那是如何在里面能正常返回的.

小Tips:如果我们直接运行APP.然后,回退到桌面再在桌面使用3DTouch(不退出APP).那么我们调用相应方法的时候看起来是首先走的3DTouch的响应方法performActionForShortcutItem然后didfinishlaunch没走.如果我们把程序杀死,就不能看到调试信息.其实我们可以在command + R的同时一直按home键.让App不会起来.这个时候就不会去调用didfinishlaunch.这是看到的调用顺序基本上可以说是准确的.

根据小Tips里面的方法,我们可以得出,在不进入程序的情况下,第一次使用桌面的3DTouch功能.首先调用的是`didfinishLaunch`,然后才是3DTouch的响应方法.后面的话因为已经lauch了就只会直接调用3DTouch的响应方法了.
//创建UIApplicationShortcutItem
	UIApplicationShortcutItem *applicationShortcutItemItem1 = [[UIApplicationShortcutItem alloc] initWithType:@"Message" localizedTitle:@"消息" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage] userInfo:nil];
	UIApplicationShortcutItem *applicationShortcutItemItem2 = [[UIApplicationShortcutItem alloc] initWithType:@"hehe" localizedTitle:@"呵呵" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage] userInfo:nil];
	//把item1和item2添加到系统的item属性里面
    application.shortcutItems = @[applicationShortcutItemItem1 ,applicationShortcutItemItem2];
其实.桌面呼出的3DTouch工具栏(个人喜欢这么称呼)会根据位置不同而排列不同.比如,如果应用Icon在左上方
	那么.Item的排列方向是,先添加进去的排在上面.图标会在左边.其实也就是说,先添加进去的会离手点击的Icon近.图标的排列就是应用Icon在哪边屏幕(左右).图标就在哪边.

###应用内的3DTouch

1.需要在当前.能够使用3DTouch的控制器里面遵循UIViewControllerPreviewingDelegate 2.然后注册一下代理[self registerForPreviewingWithDelegate:self sourceView:self.view]; 3.使用代理的两个方法

// If you return nil, a preview presentation will not be performed
	- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location NS_AVAILABLE_IOS(9_0);
	- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0);
第一个是peek状态的代理方法,第二个是pop状态的代理方法.
peek英文的意思是一瞥.

3d ios touch 开发 iphone 3d touch怎么开_ios_02


第二个代理方法是pop页面也就是说直接用力按进去的样子.

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
//    previewingContext.sourceRect = self.view.frame;
    //peek从哪里出来.比如用的是self.button.frame就是从button上面抛出来.
    previewingContext.sourceRect = self.button.frame;
    ViewControllerDetail *VCDetail = [[ViewControllerDetail alloc] init];
    return VCDetail;
}

对比与QQ比如按一个聊天cell往上拉之后的删除的几个类似于AlertControl的东西又是怎么做的呢

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

    }];
    NSArray *actions = @[action1,action2];
    return actions;
}

是不是和AlertControl很像.3DTouch我就讲到这里.