美文网首页
ios 3D Touch运用

ios 3D Touch运用

作者: oc123 | 来源:发表于2017-11-27 14:52 被阅读0次

概述:iOS9中引入3D Touch功能,iOS10中对其使用需求更频繁,,所以对3D Touch功能做一些了解是很有必要的;
ShortcutItem功能允许用户在主屏幕上对应用图标使用3DTouch操作,如果本次操作有效,则会出现如截图效果:

3D Touch截图.png

静态添加
在info.plist中添加UIApplicationShortcutItems关键字,如下配置即可:

静态例子.png

UIApplicationShortcutItemType: 快捷可选项的特定字符串(必填)
UIApplicationShortcutItemTitle: 快捷可选项的标题(必填)
UIApplicationShortcutItemSubtitle: 快捷可选项的子标题(可选)
UIApplicationShortcutItemIconType: 快捷可选项的图标(可选)
UIApplicationShortcutItemIconFile: 快捷可选项的自定义图标(可选)
UIApplicationShortcutItemUserInfo: 快捷可选项的附加信息(可选)

动态添加
在AppDelegate中的didFinishLaunchingWithOptions,添加如下代码:

    /**
      type: 快捷可选项的特定字符串(必填)
      localizedTitle: 快捷可选项的标题(必填)
      localizedSubtitle: 快捷可选项的子标题(可选)
      icon: 快捷可选项的图标(可选)
      userInfo: 快捷可选项的附加信息(可选)
    */

    UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"custom"];//自定义Icon
    UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];//调用系统Icon
    //以上二选一
    UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"搜索唯一标识Str" localizedTitle:@"搜索" localizedSubtitle:@"搜索副标题" icon:icon userInfo:nil];
    application.shortcutItems = @[item];

说明:
1)系统限制每个App最多能够显示4个Action Item,其中包括静态方式和动态方式进行创建的;
2)如果静态和动态方式同时使用的时候,给UIApplicationshortcutItems赋值的时候不会覆盖
3)注,定义的图标 是35x35 的单色图标
当app在后台的时候UIApplication提供了一个回调方法,如下:

  //依据shortcutItem的type和userinfo来做出不同的事件处理
  - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler{
    //判断先前我们设置的唯一标识(分享要在桌面实现就别做处理,上架后苹果给添加的)
    if([shortcutItem.type isEqualToString:@"com.wsx.share"]){
        NSArray *arr = @[@"hello 3D Touch"];
        UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:arr applicationActivities:nil];
        //设置当前的VC 为rootVC
        [self.window.rootViewController presentViewController:vc animated:YES completion:^{
        }];
    }
    else if ([shortcutItem.type isEqualToString:@"搜索对应特定Str"])
    {
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"好想你" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:@"sure", nil];
        [alertView show];
    }
    else if ([shortcutItem.type isEqualToString:@"UITouchText.look"])
    {
        UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:@"温馨提示" delegate:nil cancelButtonTitle:@"cancel" destructiveButtonTitle:@"删除" otherButtonTitles:@"更多", nil];
        [sheet showInView:self.window];
    }
    else if ([shortcutItem.type isEqualToString:@"UITouchText.compose"])
    {
        NSLog(@"UITouchText.compose");
    }
  }

completionHandler在API的说明中我们看到当应用并非在后台,而是直接重新开进程的时候,直接返回No,那么这个时候,我们的回调会放在didFinishLaunchingWithOptions中;
从launchOptions中获取shortcutItem (UIApplicationLaunchOptionsShortcutItemKey)

    //根据不同的Action响应不同的事件
    UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];

Peek(预览) and Pop(详阅)
参考于http://www.cocoachina.com/ios/20161114/18071.html
不啰嗦,效果自查,代码如下:

//首先遵循代理  UIViewControllerPreviewingDelegate
//在控制器内为需要实现Peek & Pop交互的控件注册Peek & Pop功能
[self registerForPreviewingWithDelegate:self sourceView:要功能的控件];
#pragma mark - 3D Touch
//当进入Peek状态时,系统会回调如下方法
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewingDelegate>)previewingContext viewControllerForLocation:(CGPoint)location
{
    // previewingContext.sourceView: 触发Peek & Pop操作的视图
    // previewingContext.sourceRect: 设置触发操作的视图的不被虚化的区域
    
    ViewController *detailVC = [[ViewController alloc] init];//DetailViewController
    detailVC.view.backgroundColor = [UIColor whiteColor];
    // 预览区域大小(可不设置)
    //    detailVC.preferredContentSize = CGSizeMake(0, 300);
    
    return detailVC;
}
//当进入Pop状态时,系统会回调如下方法
- (void)previewingContext:(id <UIViewControllerPreviewingDelegate>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
    [self.navigationController pushViewController:viewControllerToCommit animated:YES];
}
//在Peek时希望提供一些快捷选项,需要在DetailViewController中重写previewActionItems的getter方法
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"选项一" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"选项二" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"选项三" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"选项组" style:UIPreviewActionStyleDefault actions:@[action1, action2]];
    
    return @[action1, action2, action3, actionGroup];
}

相关文章

网友评论

      本文标题:ios 3D Touch运用

      本文链接:https://www.haomeiwen.com/subject/szjrbxtx.html