关于3DTouch

来源:互联网 发布:淘宝信用值怎么看 编辑:程序博客网 时间:2024/06/06 05:39

关于3DTouch

3D Touch最开始在Apple Watch上面,叫 Force Touch ,后在iPhone6s以后的手机加入,并改名3D Touch。通俗的说就是屏幕根据感受的力度大小,提供一些快捷操作,有Peek Pop 两种新手势。详细介绍可参考苹果官方文档。

  • 设置Quick Actions
    1在应用图标上设置:可以通过在info.plist里设置,也可以通过代码动态设置 ,首先说一下通过info.plist设置,这里只设置了一项,多项的话可以增加UIApplicationShortcutItems数组内容(Actions最多显示4个,优先显示静态Actions,然后剩余个数显示shortcutItems的前几个。)。如下图(这些输入的时候不自动联想处来,需要自己完全打出来)
    通过info.plist设置

2.通过代码设置:

NSMutableArray *shortcutItems = [NSMutableArray array]; //实例化数组UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"1" localizedTitle:@"分享"];    UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"2" localizedTitle:@"扫一扫"];        UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"3" localizedTitle:@"播放歌曲" localizedSubtitle:@"一次就好" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay] userInfo:nil];;    //设置原有的图标UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"3" localizedTitle:@"快速定位" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"aaa"] userInfo:nil];//设置自定义的图片,图标都会默认被默认改成黑白色[shortcutItems addObject:item1];[shortcutItems addObject:item2];[shortcutItems addObject:item3];[shortcutItems addObject:item4];[[UIApplication sharedApplication] setShortcutItems:shortcutItems];

然后通过- (void)application:(UIApplication )application performActionForShortcutItem:(UIApplicationShortcutItem )shortcutItem completionHandler:(void (^)(BOOL))completionHandler方法处理每个快捷项的点击方法。
代码如下:

/** 处理shortcutItem */- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {switch (shortcutItem.type.integerValue) {    case 1: { // 分享        [[NSNotificationCenter defaultCenter] postNotificationName:@"enjoy" object:self userInfo:@{@"type":@"1"}];    }    case 2: { // 扫一扫        [[NSNotificationCenter defaultCenter] postNotificationName:@"scan" object:self userInfo:@{@"type":@"2"}];    }   break;    default:        break;}

}

这里只处理了其中两项,然后在相应的地方接收并作出响应即可。

接下来说一下Peek&POP
Peek窗口就是通过用力按压某个区域的一个实时快照,不可点击但是有Quick Actions菜单

pe’ek触发阶段的三种状态:

  • 长按【显示一个焦点视图,触发Peek的源视图高亮,其它视图都处于模糊状态】
  • 轻压【显示Peek窗口,此时如果Peek窗口支持Quick Actions,往上滑会显示Quick Actions菜单,此时的Peek窗口是不可以点击的】
  • 重压 【进入到真正的ViewController】

Peek由一个 可响应事件的View 触发,默认是关闭的,我们需要通过控制器的 registerForPreviewingWithDelegate: sourceView: 方法注册,第一个参数为 UIViewControllerPreviewingDelegate 的代理,Peek触发轻压时会调用其 previewingContext:viewControllerForLocation 方法,重压时会调用 previewingContext:commitViewController: 方法。第二个参数为触发Peek事件的源视图
注册以及实现相关代理方法的代码如下

这个方法检查是否开启了3D touch
-(void)check3DTouch{
//检测是否开启了3D touch
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
// 注册Peek和Pop方法
[self registerForPreviewingWithDelegate:self sourceView:self.view];
}
}

/* peek手势 /
- (nullable UIViewController *)previewingContext:(id )previewingContext viewControllerForLocation:(CGPoint)location {
detaileViewController *childVC = [[detaileViewController alloc] init];

// 获取用户手势点所在cell的下标。同时判断手势点是否超出tableView响应范围。if (![self getShouldShowRectAndIndexPathWithLocation:location])    return nil;previewingContext.sourceRect = self.sourceRect;return childVC;

}

实现了相关的代理方法
/* pop手势 /
- (void)previewingContext:(id )previewingContext commitViewController:(UIViewController *)viewControllerToCommit {

[self tableView:self.tableView didSelectRowAtIndexPath:self.indexPath];detaileViewController *detai = [[detaileViewController alloc] init];[self showViewController:detai sender:self];}

然后再在pe’ek出来的ViewController中重写previewActionItems 方法

代码如下
//在这个利用到了UIPreviewAction 和 UIPreviewActionGroup 2个iOS9新加的类型和他们的初始化方法我们重写

 -(NSArray《id《UIPreviewActionItem》》 *)previewActionItems{ // 生成UIPreviewAction    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Action 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {        NSLog(@"Action 1 selected");}];    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"Action 2" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {    NSLog(@"Action 2 selected");}];UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"Action 3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {    NSLog(@"Action 3 selected");}];UIPreviewAction *tap1 = [UIPreviewAction actionWithTitle:@"tap 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {    NSLog(@"tap 1 selected");}];UIPreviewAction *tap2 = [UIPreviewAction actionWithTitle:@"tap 2" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {    NSLog(@"tap 2 selected");}];UIPreviewAction *tap3 = [UIPreviewAction actionWithTitle:@"tap 3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {    NSLog(@"tap 3 selected");}];// 塞到UIPreviewActionGroup中NSArray *actions = @[action1, action2, action3];NSArray *taps = @[tap1, tap2, tap3];UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:actions];UIPreviewActionGroup *group2 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:taps];NSArray *group = @[group1,group2];return group;

}

最终结果图如下:
这里写图片描述
这里写图片描述这里写图片描述这里写图片描述

0 1
原创粉丝点击