美文网首页
iOS 3D Touch开发

iOS 3D Touch开发

作者: Double_Chen | 来源:发表于2017-03-28 17:11 被阅读518次

学习资料来源于http://www.cnblogs.com/zhanglinfeng/p/5133939.html
里面讲的已经够详细了,可以直接跳转进去学习,这里是自己理解之后进行的记录。

添加3D Touch选项

开发中的demo 3D Touch没有效果,上线的app默认会有一个分享功能;
最多可以添加4个3D Touch选项,加上上线后的分享选项,最多能显示5个。

添加方法有两种,一种在plist文件中,另一种用代码。

plist文件中添加
转载的网址中的图片
UIApplicationShortcutItems:数组中的元素就是我们的那些快捷选项标签。
UIApplicationShortcutItemTitle:标签标题(必填)
UIApplicationShortcutItemType:标签的唯一标识(必填)
UIApplicationShortcutItemIconType:使用系统图标的类型,如搜索、定位、home等(可选)
UIApplicationShortcutItemIconFile:使用项目中的图片作为标签图标(可选)
UIApplicationShortcutItemSubtitle:标签副标题(可选)
UIApplicationShortcutItemUserInfo:字典信息,如传值使用(可选)

这种方式添加的item不能动态修改

代码添加

    //手动创建3D Touch选项
    //系统风格的icon
    UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay];
    //自定义风格的icon
    UIApplicationShortcutIcon *customIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"customImg.png"];
    
    //创建选项
    UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"shortcutItem.2" localizedTitle:@"代码创建的标题" localizedSubtitle:@"子标题" icon:icon userInfo:nil];
    UIApplicationShortcutItem *customItem = [[UIApplicationShortcutItem alloc] initWithType:@"shortcutItem.3" localizedTitle:@"代码创建2" localizedSubtitle:@"子标题" icon:customIcon userInfo:nil];
    
    //添加到选项数组
    [UIApplication sharedApplication].shortcutItems = @[item,customItem];

代码添加的方式可以后期动态修改,还是比较方便的

图片.png
上面系统自带的UIApplicationShortcutIconType系列icon,资料来源于http://www.cocoachina.com/ios/20161114/18071.html

关于程序启动

程序在被干掉的情况下,点击图标进入程序,会进入

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

当程序通过3D Touch选项进入程序,而程序是被杀死的状态,同样会进入上面的方法,这里可以通过判断用户是不是通过3DTouch进入程序来进行响应

 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
    if (shortcutItem) {
        //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
        if([shortcutItem.type isEqualToString:@"shortcutItem.0"]){
      
        } else if ([shortcutItem.type isEqualToString:@"shortcutItem.1"]) {
        }
        return NO;    //要返回NO,后面会说
    }
    return YES;
}

还有个情况是程序在后台,通过3D Touch的方式进入,此时是不会进入上面的方法,因为该方法只会执行一次

所以有另外一个入口:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler

这个方法调用的条件为:
1.程序通过快捷选项进入;
2.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions这个方法中返回的是YES,所以上面的return NO,是为了防止同时激活两个入口方法,处理两次快捷选项的逻辑。
再详细一点,didFinishLaunchingWithOptions这个方法是比performActionForShortcutItem更早一步执行,当didFinishLaunchingWithOptions返回了NO之后,performActionForShortcutItem就不会执行

跳转

现在到了处理快捷选项的步骤了, 程序首次启动的处理方法在上面的if else里面;程序从后台进入的处理方法一样:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
    if([shortcutItem.type isEqualToString:@"shortcutItem.0"]){

    } else if ([shortcutItem.type isEqualToString:@"shortcutItem.1"]) {

    }

    if (completionHandler) {
        completionHandler(YES);
    }
}

权限

    /*
     先遵循代理UIViewControllerPreviewingDelegate
     该代理用于展示按压后预览的页面,以及按压成功后跳转到该控制器
     */
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        NSLog(@"3D Touch 可用!");
        //注册3DTouch的peek(预览)和pop功能
        [self registerForPreviewingWithDelegate:self sourceView:self.touchBtn];
    } else {
        NSLog(@"3D Touch 无效");
    }

注意一点,上面代码在viewDidLoad内总是无效的,可以在viewDidAppear中或触发事件中,这个问题应该与视图加载程度有关

上面代码已经遵循了代理并且设置了可按压的view,接下来实现代理的方法进行一些设置,即可进行页面预览及页面跳转

#pragma mark - UIViewControllerPreviewingDelegate

//peek(预览)
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
    //设定预览的界面
    SearchVC *searchVC = [[SearchVC alloc] init];

    //调整不被虚化的范围,按压的那个cell不被虚化(轻轻按压时周边会被虚化,再少用力展示预览,再加力跳页至设定界面)
    CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,50);
    previewingContext.sourceRect = rect;
    
    //返回预览界面
    return searchVC;
}

//pop(按用点力进入)
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    [self showViewController:viewControllerToCommit sender:self];
}

被跳转的Controller

被跳转的控制器可以添加几个item,在上级页面按压时向上滑动弹出

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action1");
    }];
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"Action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action2");
    }];
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"Action3" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action3");
    }];
    
    NSArray *actions = @[action1,action2,action3];
    return actions;
}

3DTouch功能差不多就这些了,开头给的原网址里面有很清晰的讲解及demo,可以下载看看。

相关文章

网友评论

      本文标题:iOS 3D Touch开发

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