IOS实现3DTouch功能

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



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

一、iocn按下效果

这里有两种方式实现:

1、通过plist文件静态设置


[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. UIApplicationShortcutItemUserInfo信息  
  2. UIApplicationShortcutItemIconFile图标名称  
  3. UIApplicationShortcutItemIconType图标类型  
  4. UIApplicationShortcutItemTitle标题  
  5. UIApplicationShortcutItemSubTitle副标题  

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. -(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler  
  2. {  
  3.     UINavigationController *nav = (UINavigationController *)self.window.rootViewController;  
  4.     if([shortcutItem.type isEqualToString:@"ONE"]){  
  5.         UIViewController *vc = [[UIViewController alloc] init];  
  6.         vc.title = @"第一个";  
  7.         vc.view.backgroundColor = [UIColor redColor];  
  8.         [nav pushViewController:vc animated:YES];  
  9.     }else if ([shortcutItem.type isEqualToString:@"TWO"]){  
  10.         UIViewController *vc = [[UIViewController alloc] init];  
  11.         vc.title = @"第二个";  
  12.         vc.view.backgroundColor = [UIColor greenColor];  
  13.         [nav pushViewController:vc animated:YES];  
  14.     }  
  15. }  

2、通过代码动态创建

首先在AppDelegate的didFinishLaunchingWithOptions里面初始化

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
  2.     // Override point for customization after application launch.  
  3.       
  4.     self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];  
  5.       
  6.     UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc]init]];  
  7.     self.window.rootViewController = nav;  
  8.       
  9.     [self.window makeKeyAndVisible];  
  10.       
  11.     [self setup3DTouch:application];  
  12.       
  13. //    [self setupSpotlight];  
  14.       
  15.     return YES;  
  16. }  
具体初始化方法

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. - (void)setup3DTouch:(UIApplication *)application  
  2. {  
  3.     /** 
  4.      type 该item 唯一标识符 
  5.      localizedTitle :标题 
  6.      localizedSubtitle:副标题 
  7.      icon:icon图标 可以使用系统类型 也可以使用自定义的图片 
  8.      userInfo:用户信息字典 自定义参数,完成具体功能需求 
  9.      */  
  10. //    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"标签.png"];  
  11.     UIApplicationShortcutIcon *cameraIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];  
  12.     UIApplicationShortcutItem *cameraItem = [[UIApplicationShortcutItem alloc] initWithType:@"ONE" localizedTitle:@"拍照" localizedSubtitle:@"" icon:cameraIcon userInfo:nil];  
  13.       
  14.     UIApplicationShortcutIcon *shareIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];  
  15.     UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"TWO" localizedTitle:@"分享" localizedSubtitle:@"" icon:shareIcon userInfo:nil];  
  16.     /** 将items 添加到app图标 */  
  17.     application.shortcutItems = @[cameraItem,shareItem];  
  18. }  

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. -(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler  
  2. {  
  3.     UINavigationController *nav = (UINavigationController *)self.window.rootViewController;  
  4.     if([shortcutItem.type isEqualToString:@"ONE"]){  
  5.         UIViewController *vc = [[UIViewController alloc] init];  
  6.         vc.title = @"第一个";  
  7.         vc.view.backgroundColor = [UIColor redColor];  
  8.         [nav pushViewController:vc animated:YES];  
  9.     }else if ([shortcutItem.type isEqualToString:@"TWO"]){  
  10.         UIViewController *vc = [[UIViewController alloc] init];  
  11.         vc.title = @"第二个";  
  12.         vc.view.backgroundColor = [UIColor greenColor];  
  13.         [nav pushViewController:vc animated:YES];  
  14.     }  
  15. }  

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

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

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


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma mark - UIViewControllerPreviewingDelegate  
  2. -(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location  
  3. {  
  4.     NSIndexPath *index = [self.tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];  
  5.     NewsListModel *model = self.lists[index.row];  
  6.       
  7.     NewsDetailsViewController *showVC = [[NewsDetailsViewController alloc]init];  
  8.     showVC.newsID = model.news_id;  
  9.       
  10.     CGRect rect = CGRectMake(00,  previewingContext.sourceView.ab_width, previewingContext.sourceView.ab_height);  
  11.     previewingContext.sourceRect = rect;  
  12.       
  13.     return showVC;  
  14. }  
到这里就能有弹出预览界面效果了,如果还是实现下面的几个选项功能,需要在你预览界面里面实现一个方法

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. - (NSArray<id<UIPreviewActionItem>> *)previewActionItems  
  2. {  
  3.     UIPreviewAction *action0 = [UIPreviewAction actionWithTitle:@"action0" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {  
  4.         NSLog(@"%s, line = %d, action0 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);  
  5.           
  6.     }];  
  7.       
  8.     UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {  
  9.         NSLog(@"%s, line = %d, action1 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);  
  10.     }];  
  11.       
  12.     UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {  
  13.         NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);  
  14.     }];  
  15.     UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {  
  16.         NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);  
  17.     }];  
  18.       
  19.     //该按钮可以是一个组,点击该组时,跳到组里面的按钮.  
  20.     UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"actionGroup" style:UIPreviewActionStyleSelected actions:@[action2, action3]];  
  21.     //直接返回数组.  
  22.     return  @[action0,action1,actionGroup];  
  23. }  

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

再实现一个代理方法

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma mark - UIViewControllerPreviewingDelegate  
  2. -(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit  
  3. {  
  4.     [self showViewController:viewControllerToCommit sender:self];  
  5. }  
这样就能直接puhs想要的界面了
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值