iOS9 3DTouch功能实现

一. 添加点击桌面icon的3DTouch,有两种添加方式 (最多添加4个item)

1.静态添加

例如:

先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:

必填项(下面两个键值是必须设置的): 

UIApplicationShortcutItemType  这个键值设置一个快捷通道类型的字符串 

UIApplicationShortcutItemTitle  这个键值设置标签的标题

选填项(下面这些键值不是必须设置的) :

UIApplicationShortcutItemSubtitle  设置标签的副标题

UIApplicationShortcutItemIconType  设置标签Icon类型

UIApplicationShortcutItemIconFile   设置标签的Icon文件

UIApplicationShortcutItemUserInfo  设置信息字典(用于传值)

2.动态添加

在这个方法中   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  动态添加

例如:

#pragma mark - 3DTouch

- (void)create3DTouchActionShow:(BOOL)isShow

{

    UIApplication *application = [UIApplication sharedApplication];

    

    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage];

    UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"1"

                                                                        localizedTitle:@"发通知"

                                                                     localizedSubtitle:nil

                                                                                  icon:icon1

                                                                              userInfo:nil];

    

    UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMail];

    UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"2"

                                                                        localizedTitle:@"发投票"

                                                                     localizedSubtitle:nil

                                                                                  icon:icon2

                                                                              userInfo:nil];

    

    UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];

    UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"3"

                                                                        localizedTitle:@"我的班级"

                                                                     localizedSubtitle:nil

                                                                                  icon:icon3

                                                                              userInfo:nil];

    

    UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay];

    UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"4"

                                                                        localizedTitle:@"我的智云"

                                                                     localizedSubtitle:nil

                                                                                  icon:icon4

                                                                              userInfo:nil];

    

    if (isShow) {   // 这里的isShow是我用来判断账号有没有登录 (已经登录的话直接跳转到响应功能 没有登录的话 跳转到登录页面)

        application.shortcutItems = @[item1, item2, item3, item4];

    }else{

        application.shortcutItems = @[];

    }

}

添加完item后 需要实现点击item后的方法

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

例如:

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

{

    // type 是item的唯一标示  可以用来判断点击的是哪个item 当然也可以用别的方式判断 title等

  // case 里面的实现自己写  下面是举例的4个方法

        NSString *itemType = shortcutItem.type;  

        switch (itemType.intValue) {

            case 1:{

                MyCreatViewController *mvc = [[MyCreatViewController alloc]init];

                mvc.mark =@"1";//发通知

                UINavigationController *nav = [[UINavigationController alloc]

                                               initWithRootViewController:mvc];

                [self.window.rootViewController presentViewController:nav animated:YES completion:nil];

            }

                break;

            case 2:{

                MyCreatViewController *mvc = [[MyCreatViewController alloc]init];

                mvc.mark =@"2";//发投票

                UINavigationController *nav = [[UINavigationController alloc]

                                               initWithRootViewController:mvc];

                [self.window.rootViewController presentViewController:nav animated:YES completion:nil];

            }

                break;

            case 3:{

                ClassManageViewController *cmvc = [[ClassManageViewController alloc] init];

                cmvc.hidesBottomBarWhenPushed = YES;

                UITabBarController *tab = (UITabBarController *)self.window.rootViewController;

                tab.selectedIndex = 4;

                UINavigationController *me = (UINavigationController *)tab.selectedViewController;

                [me pushViewController:cmvc animated:YES];

            }

                break;

            case 4:{

                MyZhiYunViewController *mzy = [[MyZhiYunViewController alloc] init];

                mzy.hidesBottomBarWhenPushed = YES;

                UITabBarController *tab = (UITabBarController *)self.window.rootViewController;

                tab.selectedIndex = 4;

                UINavigationController *me = (UINavigationController *)tab.selectedViewController;

                [me pushViewController:mzy animated:YES];

            }

                break;

        }}

到这里,桌面的3DTouch就实现了

二. 如果想点击cell 实现预览效果 

在tableview所在的viewController  遵守 UIViewControllerPreviewingDelegate 协议

if (cell == nil) {

        cell = [[NotifyGroupCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

  // 判断是否有压力感应 (就是看能不能实现3DTouch)

        if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {

  // 注册需要实现3DTouch的View

            [self registerForPreviewingWithDelegate:self sourceView:cell];

        }

然后实现两个手势 peek 和 pop peek就是预览 pop就是在peek的基础上再用力按实现的方法

// peek 手势

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location

{

  // 得到用力按的cell的位置

    NSIndexPath *indexPath = [_tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];

  

  // 返回的controller就是需要预览的controller 比如 点击cell后跳转到A 这里返回A就可以    

   UIViewController *A = [[UIViewController alloc] init];

    return A;

}

 

// pop手势

- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit

{

    NSIndexPath *indexPath = [_tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];

    [self tableView:_tableView didSelectRowAtIndexPath:indexPath];

}

 

在controller A 的.m文件中实现一个方法 就是在预览A时上滑页面下面出现的选项

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems

{

  /*

  UIPreviewActionStyleDefault 默认

  UIPreviewActionStyleSelected 带对勾的

  :UIPreviewActionStyleDestructive 红色的

  */

    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"me" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        NSLog(@"me");

    }];

    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"you" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        NSLog(@"you");

    }];

    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"him" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        NSLog(@"him");

    }];

    

    NSArray *actions = @[action1, action2, action3];

    return actions;

}

 

posted @ 2016-04-13 14:11  guaijie123  阅读(375)  评论(0编辑  收藏  举报