/**
笔者废话:懒癌成疾!懒癌成疾!懒癌成疾!重要的事情说三遍,此篇用文本文档花了15分钟写完。想着晚上花一点时间整理发布,结果今天推明天,明天推后天,一天又一天,整整拖了一周。我想我应该是没救了。好算最终还是选择一个特无聊特闲的下午,实在不知道做什么的时候,想起来整理了。这样看,还有救!(大清国今天完了吗?没有!
*/
正题:iOS9,苹果添加了3DTouch,最近因为项目需求进行了3DTouch的简单使用。
开发环境:Xcode7.1必须在支持3DTouch的设备上才可生效。越狱设备可模拟3DTouch效果。(使用长按手势替换)
模拟器3DTouch:目前模拟器无法模拟3DTouch 效果。不过早有大神给出解决方案 https://github.com/DeskConnect/SBShortcutMenuSimulator
ios9中UITouch类添加了触摸(压力)相关属性 UIForceTouchCapability UITouchType等。可以为画笔提供更好的用户体验和解决方案。暂无用到所以此处略。
快捷操作 ShortcutItem
当用户在桌面按下APP时,会弹出开发人员提前设置好的标签项,用户点选标签项后会打开APP,执行快捷操作。
如何添加标签项,苹果为我们提供了两种形式,分别是静态标签和动态标签。
1、静态标签:设置静态标签既我们提前在 plist 文件中对标签项进行配置,用户安装 APP 后便可显示并使用此标签。
首先在 plist文件中添加如下键值对(目前无提示)
UIApplicationShortcutItems (array 类型)插入标签组
然后在数组中可以添加多个item(标签项),接着设置标签项的属性字段
UIApplicationShortcutItemType 设置标签项的自定义类型
UIApplicationShortcutItemTitle 设置标签项的显示标题
以上两个属性字段为必要条件
UIApplicationShortcutItemSubtitle 设置标签项的小标题
UIApplicationShortcutItemIconType 设置标签项的图标类型(系统)
UIApplicationShortcutItemIconFile 设置自定义图片作为标签项的图标
UIApplicationShortcutItemUserInfo 设置标签项的信息
2、动态标签:使用代码对标签项进行设置,在需要的位置动态添加标签项。
创建标签项:UIApplicationShortcutItem类 (可选添加)
创建可变的标签项:UIMutableApplicationShortcutItem
设置标签项的图标:UIApplicationShortcutIcon类 同样可以设置系统图标和自定义图片两种
最后将创建好的标签项数组添加到 APP 上:[UIApplication sharedApplication].shortcutItems = array;
下面是在项目中的简单使用:
NSMutableArray *arrShortItem = [NSMutableArray new];
if (isSignIn) {[arrShortItem addObject:[[UIApplicationShortcutItem alloc]initWithType:@"签到" localizedTitle:@"快速签到" localizedSubtitle: nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"ic_attendance.png"] userInfo:nil]];
}
if (isSignOut) {
[arrShortItem addObject:[[UIApplicationShortcutItem alloc]initWithType:@"签退" localizedTitle:@"快速签退" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"ic_sign_out.png"] userInfo:nil]];
}
[UIApplication sharedApplication].shortcutItems = arrShortItem;
需要注意的是,标签项只能设置四个。静态标签和动态标签可混合使用,动态标签会添加到静态标签的后方,如果超出4个,将不会显示。
设置完标签项,接着要实现我们具体想要的操作。我们在 AppDelegate 中实现其回调方法
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
}
在此回调方法中,我们可以通过对判断标签项的类型或信息来执行不同的逻辑操作。
Peek and Pop(预览和详阅)
根据你对ViewController中内容按下的压力不同,有三种不同的显示效果。
1.轻按。周围内容变得模糊,按击的添加了peek的View隐隐浮出表层,暗示此内容可以预览。
2.peek。轻按一定时间后便过度到视图预览,弹出一个你设置的视图。用户如果一直保持触摸,可以向上滑动,下方会弹出我们自定义的快捷操作菜单,并且此时可以停止触摸,peek 会一直保持在屏幕上。
3.在 peek 的基础上更加用力按下,会出现一个过度动画,pop 出详情视图。
1.注册 peek:注册方法写在 ViewController中
[self registerForPreviewingWithDelegate:self sourceView:XXXView];
2.遵从协议
UIViewControllerPreviewingDelegate
3.实现协议中的代理方法
-(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
UIViewController *ccn_vc = [[UIViewController alloc] init];
ccn_vc.preferredContentSize = CGSizeMake(15,100);
return ccn_vc;
}
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
[self showViewController:viewControllerToCommit sender:self];
}
//context.sourceRect 设置点选区域浮出效果区域的范围(可以不设置,区域为添加 Peek 效果 View 的范围)
//返回值为 peek 所要显示的 ViewController;
peek向上滑动,展示下方快捷操作菜单。
需要在我们上面代理方法返回值ViewController 中实现相关的方法。
-(NSArray<id<UIPreviewActionItem>> *)previewActionItems
NSMutableArray *mutableArr = [[NSMutableArray alloc]init];
//可以为单层菜单,也可有子菜单。下方为子菜单的简单例子
UIPreviewAction *preView11 = [UIPreviewAction actionWithTitle:@"我是第一组的第一行" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"我是第一组的第一行");
}];
UIPreviewAction *preView12 = [UIPreviewAction actionWithTitle:@"我是第一组的第二行" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"我是第一组的第二行");
}];
UIPreviewActionGroup *actionGroup1 = [UIPreviewActionGroup actionGroupWithTitle:@"我是第一组" style:UIPreviewActionStyleDefault actions:@[preView11,preView12]];
UIPreviewAction *preView21 = [UIPreviewAction actionWithTitle:@"我是第二组的第一行" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"我是第二组的第一行");
}];
UIPreviewAction *preView22 = [UIPreviewAction actionWithTitle:@"我是第二组的第二行" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"我是第二组的第二行");
}];
UIPreviewActionGroup *actionGroup2 = [UIPreviewActionGroup actionGroupWithTitle:@"我是第二组" style:UIPreviewActionStyleDefault actions:@[preView21,preView22]];
[mutableArr addObject:actionGroup1];
[mutableArr addObject:actionGroup2];
return mutableArr;
}
有一点需要注意:你的应用需要在运行时检测3DTouch 的可用性。在APP入口函数中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
}
需要进行一下判断,在launchOptions中有UIApplicationLaunchOptionsShortcutItem Key这样一个键,通过它,我们可以区别是否是从标签进入的app,如果是则处理结束逻辑后,返回NO,防止处理逻辑被反复回调。
以上。