关于3DTouch
3D Touch最开始在Apple Watch上面,叫 Force Touch ,后在iPhone6s以后的手机加入,并改名3D Touch。通俗的说就是屏幕根据感受的力度大小,提供一些快捷操作,有Peek Pop 两种新手势。详细介绍可参考苹果官方文档。
- 设置Quick Actions
1在应用图标上设置:可以通过在info.plist里设置,也可以通过代码动态设置 ,首先说一下通过info.plist设置,这里只设置了一项,多项的话可以增加UIApplicationShortcutItems数组内容(Actions最多显示4个,优先显示静态Actions,然后剩余个数显示shortcutItems的前几个。)。如下图(这些输入的时候不自动联想处来,需要自己完全打出来)
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;
}
最终结果图如下: