关于3DTouch

关于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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值