IOS实现3DTouch功能

原创 2016年04月22日 10:35:11

赶需求期间,想着别人应用都搞起3DTouch功能了,咱也来装逼一会,凸显下逼格。

废话少说,先搜索了前人的热心奉献,自己再动手丰衣足食,下面归纳总结下。

首先,想要体验3DTouch功能,必须至少得是iPhone6s iPhone6s plus的机型,没有的就去借,去偷,去抢,去跟老板申请测试机吧。

不过有牛人搞了个模拟器也能支持3DTouch功能,具体查看https://github.com/DeskConnect/SBShortcutMenuSimulator

以下总结由于作者懒,就不贴啥动图了,基本是静态截图。


3DTouch目前在手机上有两种体现方式,一种是用力按下app的图片icon,会弹出选项菜单,就像电脑上的右键。一种是在应用内的界面上用力按下,弹出的预览界面。



接下来就以这两种效果分别说明如何使用3DTouch功能。

一、iocn按下效果

这里有两种方式实现:

1、通过plist文件静态设置


UIApplicationShortcutItemUserInfo信息
UIApplicationShortcutItemIconFile图标名称
UIApplicationShortcutItemIconType图标类型
UIApplicationShortcutItemTitle标题
UIApplicationShortcutItemSubTitle副标题

然后在AppDelegate里面实现代理方法,通过绑定的标签type来实现具体代码。

-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    if([shortcutItem.type isEqualToString:@"ONE"]){
        UIViewController *vc = [[UIViewController alloc] init];
        vc.title = @"第一个";
        vc.view.backgroundColor = [UIColor redColor];
        [nav pushViewController:vc animated:YES];
    }else if ([shortcutItem.type isEqualToString:@"TWO"]){
        UIViewController *vc = [[UIViewController alloc] init];
        vc.title = @"第二个";
        vc.view.backgroundColor = [UIColor greenColor];
        [nav pushViewController:vc animated:YES];
    }
}

2、通过代码动态创建

首先在AppDelegate的didFinishLaunchingWithOptions里面初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc]init]];
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    
    [self setup3DTouch:application];
    
//    [self setupSpotlight];
    
    return YES;
}
具体初始化方法

- (void)setup3DTouch:(UIApplication *)application
{
    /**
     type 该item 唯一标识符
     localizedTitle :标题
     localizedSubtitle:副标题
     icon:icon图标 可以使用系统类型 也可以使用自定义的图片
     userInfo:用户信息字典 自定义参数,完成具体功能需求
     */
//    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"标签.png"];
    UIApplicationShortcutIcon *cameraIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];
    UIApplicationShortcutItem *cameraItem = [[UIApplicationShortcutItem alloc] initWithType:@"ONE" localizedTitle:@"拍照" localizedSubtitle:@"" icon:cameraIcon userInfo:nil];
    
    UIApplicationShortcutIcon *shareIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
    UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"TWO" localizedTitle:@"分享" localizedSubtitle:@"" icon:shareIcon userInfo:nil];
    /** 将items 添加到app图标 */
    application.shortcutItems = @[cameraItem,shareItem];
}

最后在代理方法里面实现具体需求代码

-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    if([shortcutItem.type isEqualToString:@"ONE"]){
        UIViewController *vc = [[UIViewController alloc] init];
        vc.title = @"第一个";
        vc.view.backgroundColor = [UIColor redColor];
        [nav pushViewController:vc animated:YES];
    }else if ([shortcutItem.type isEqualToString:@"TWO"]){
        UIViewController *vc = [[UIViewController alloc] init];
        vc.title = @"第二个";
        vc.view.backgroundColor = [UIColor greenColor];
        [nav pushViewController:vc animated:YES];
    }
}

二、应用内UI界面用力按下产生的3DTouch效果(这种方式也有两种实现效果)

1、比如用力按下某个cell,弹出预览的小视图,同时上滑底部出现若干个选项(Peek功能)

首先注册需要实现Touch效果的View,判断下设备系统支不支持,不然会崩溃


把当前的cell注册绑定,然后试图界面实现UIViewControllerPreviewingDelegate代理

#pragma mark - UIViewControllerPreviewingDelegate
-(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
    NSIndexPath *index = [self.tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
    NewsListModel *model = self.lists[index.row];
    
    NewsDetailsViewController *showVC = [[NewsDetailsViewController alloc]init];
    showVC.newsID = model.news_id;
    
    CGRect rect = CGRectMake(0, 0,  previewingContext.sourceView.ab_width, previewingContext.sourceView.ab_height);
    previewingContext.sourceRect = rect;
    
    return showVC;
}
到这里就能有弹出预览界面效果了,如果还是实现下面的几个选项功能,需要在你预览界面里面实现一个方法

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action0 = [UIPreviewAction actionWithTitle:@"action0" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%s, line = %d, action0 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
        
    }];
    
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%s, line = %d, action1 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
    }];
    
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
    }];
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
    }];
    
    //该按钮可以是一个组,点击该组时,跳到组里面的按钮.
    UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"actionGroup" style:UIPreviewActionStyleSelected actions:@[action2, action3]];
    //直接返回数组.
    return  @[action0,action1,actionGroup];
}

2、在第1个效果的基础上,再继续用力按下去,就会push预览界面了。(pop功能)

再实现一个代理方法

#pragma mark - UIViewControllerPreviewingDelegate
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
    [self showViewController:viewControllerToCommit sender:self];
}
这样就能直接puhs想要的界面了





版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a416863220/article/details/51217465

iOS 3DTouch 开发

看了网上很多贴,但是感觉对于有些人来说太过婉转了,所以我就来个简单粗暴的 1,设置静态标签 首先要在info.plist 里面添加键值    UIApplicationShortcutItemTy...
  • pk_sir
  • pk_sir
  • 2016-03-14 10:49:15
  • 435

iOS系统3DTouch全解析

概述 iOS10系统登录中国,在系统中对3D Touch的使用需求更频繁,所以对iOS9中便引入的3D Touch功能做一些了解是很有必要的 在日常开发中,我们经常需要使用3D Touch中的两个...
  • ZY_FlyWay
  • ZY_FlyWay
  • 2017-07-14 17:02:15
  • 623

iOS新特性实现3DTouch开发

好久没有写过文章了,今天就给大家带来一篇比较简单的开发教程吧!目的是为了让大伙能够避开那些不必要的坑,快速高效的实现功能。今天呢来和大家讲一下iOS9的新特性3DTouch开发(iOS10都已经出了B...
  • shenjie12345678
  • shenjie12345678
  • 2016-07-27 11:00:09
  • 1978

iOS开发之3DTouch集成

静态添加入口标签在info.plist中添加如图所示 各项都代表的意思首先是UIApplicationShortcutItems,他是一个数组类型,数组中的每一个元素表示一个入口标签。然后是Item...
  • sinat_30162391
  • sinat_30162391
  • 2016-04-08 13:51:34
  • 1793

IOS 3D Touch 开发教程

前一阵子伴随着苹果发布新产品iPhone6s 和 IOS9新系统,一系列关于硬件和软件的新功能、新特性逐渐进入iPhone用户的视线。这次我们就来讲讲传闻已久的3D Touch。          当...
  • He_jiabin
  • He_jiabin
  • 2016-03-02 12:17:24
  • 3031

Unity之使用IOS 3DTouch功能

Unity之使用IOS 3DTouch
  • qq_26999509
  • qq_26999509
  • 2017-04-26 16:53:21
  • 705

iOS 3DTouch 代码实现

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc...
  • chenzheiu1210
  • chenzheiu1210
  • 2016-10-19 14:18:44
  • 467

iOS中3DTouch的使用

苹果是在iphone6s开始加入的3DTouch功能.也就是说是ios9开始加入的3DTouch.3DTouch也就是根据你手按压的力度大小来触发的. 3DTouch具体有两种表现形式.第...
  • qq_18683985
  • qq_18683985
  • 2018-01-14 13:35:47
  • 193

ios模拟器展示3D Touch

With Xcode 7.0 you must develop on a device that supports 3D Touch. Simulator in Xcode 7.0 does not ...
  • u010972075
  • u010972075
  • 2015-11-05 15:09:47
  • 980

在xcode模拟器上运行3Dtouch

第一步, git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git cd SBSho...
  • hurosezhang
  • hurosezhang
  • 2016-08-15 15:52:17
  • 1712
收藏助手
不良信息举报
您举报文章:IOS实现3DTouch功能
举报原因:
原因补充:

(最多只允许输入30个字)