iOS9 3DTouch(ShortcutItem、Peek/Pop)等简单使用

/**

笔者废话:懒癌成疾!懒癌成疾!懒癌成疾!重要的事情说三遍,此篇用文本文档花了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,防止处理逻辑被反复回调。

以上。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值