苹果是在iphone6s开始加入的3DTouch功能.也就是说是ios9开始加入的3DTouch.3DTouch也就是根据你手按压的力度大小来触发的.
3DTouch具体有两种表现形式.第一种是在Launch页面,也就是在苹果的桌面上.就算我们不做关于3DTouch的任何集成.在上线的项目中(注:一定是上线的项目,Debug之类的是没有任何显示的)也有一个关于分享的3DTouch按钮
这个就是苹果系统给我们弄上去的.那么如果我们想加一个自己的应该怎么弄呢.
###桌面的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英文的意思是一瞥.第二个代理方法是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我就讲到这里.