3D Touch 使用:Peek 和 Pop

      iPhone6S开始,苹果新增了3D Touch触控技术。在实际App开发过程中,3D Touch有两大类常见应用,第一类是重按App的icon可以显示快捷功能(Quick Action),第二类是在App中,选中某个内容,可以使用peek(轻按)进行预览,使用pop(重按)切换控制器,显示完整内容。下面介绍如何使用Peek/Pop功能。

一、Peek/Pop简介

Peek:轻按,可以预览。Peek有3种状态,即Peek可用、Peek、以及Peek+PreviewAction,下面3张图片分别代表3种不同状态;

preview_available_2_2x-173x300

peek_2x-173x300

peek_quick_actions_2x-173x300

Pop:一般是导航到Peek状态下预览的控制器。

二、案例实现

2.1 案例展示

功能说明:

  • 一个简易的UITableViewController,选中某行后,可以支持Peek;
  • Peek状态下,提供两个PreviewAction;
  • Pop状态下,可以跳转控制器。

2015-11-13-14_38_28

2.2 注册forcetouch

如果forcetouch可用,则注册,并且设置代理。

  • -(void)viewDidLoad{
  •     [super viewDidLoad];
  •    
  •     //注册forceTouch
  •     if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
  •     [self registerForPreviewingWithDelegate:self sourceView:self.view];
  •     }
  •    
  • }

2.3 设置控制器遵守代理协议并实现代理方法

  • @interface HCTableViewController ()<UIViewControllerPreviewingDelegate>;
  • #pragma mark UIViewControllerPreviewingDelegate
  • -(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
  •     //获取点击的cell
  •     NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
  •     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
  •     if (!cell) {
  •         return nil;
  •     }
  •    
  •     //pre-peek状态下,重点显示的区域
  •     previewingContext.sourceRect = cell.frame;
  •    
  •     HCViewController *vc = [[HCViewController alloc] init];
  •     vc.labelText = self.dataList[indexPath.row];
  •     //peek状态下,显示的view大小
  •     vc.preferredContentSize = CGSizeMake(0, 0);
  •    
  •     return vc;
  • }
  •  
  • (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
  • {
  •     [self.navigationController pushViewController:viewControllerToCommit animated:YES];
  • }

2.4 Peek中PreviewAction的实现

Peek中的QuickAction需要在目标控制器的代码中实现。

新增一个数组属性,来存储PreviewAction;

@property (nonatomic,strong) NSArray *arrayPreviewActions;

previewActionItems方法中返回存储PreviewAction的数组;

  • -(NSArray<id<UIPreviewActionItem>> *)previewActionItems
  • {
  •     return self.arrayPreviewActions;
  • }

设置PreviewAction数组内容,并实现功能。

  • -(void)viewDidLoad{
  •     [super viewDidLoad];
  •    
  •     self.view.backgroundColor = [UIColor whiteColor];
  •    
  •     [self label];
  •    
  •     //设置previewActions
  •     self.arrayPreviewActions = @[
  •                             [UIPreviewAction actionWithTitle:@“OK” style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
  •                                 NSLog(@“Press OK”);
  •                             }],
  •                             [UIPreviewAction actionWithTitle:@“Cancel” style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
  •                                 NSLog(@“Press Cancel”);
  •                             }],
  •                             ];
  • }

发表评论

电子邮件地址不会被公开。 必填项已用*标注