iOS9新特性の3D-touch-下篇

再看一下如何在应用内集成3Dtouch.
3D-touch操作分为轻按peek跟重按pop,根据apple官方设计规范,一般来说peek呼出预览视图,我在storyboard里面创建一个PreviewController用于描述呼出的预览视图,同时创建了一个DetailViewController用于显示最终显示的视图,同时我们应该注意,pop之后的视图应该与用户正常点击进去之后没有任何区别.
此时我们应用层级为

tableView---(peek)---->previewController---(pop)--->DetailviewController

无论何时,我们在使用3D-touch的时候应当先检查3D-touch的可用性

- (void)check3Dtouch
{
    //检测3Dtouch是否可用,若可用注册预览视图代理
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        [self registerForPreviewingWithDelegate:self sourceView:self.view];
    }
}

我们在viewWillAppear里面和用户进行3D-touch相关设置的时候都要检查可用性

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self check3Dtouch];
}

///用户可能进入设置开启/关闭3Dtouch的时候,在这里需要再次检测3Dtouch可用性
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
    [self check3Dtouch];
}

别忘了设置UIViewControllerPreviewingDelegate预览视图代理.

接下来只需要在对应的代理方法里面返回相应的控制器即可


- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    
    if ([self.presentedViewController isKindOfClass:[PreviewViewController class]]) {return nil;}
    
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    PreviewViewController *previewController = [sb instantiateViewControllerWithIdentifier:@"preview"];
    
    location = CGPointMake(10, 100);
    return previewController;
}

- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    DetailViewController *detailView = [sb instantiateViewControllerWithIdentifier:@"detailView"];
    
    [self showViewController:detailView sender:self];
    
}

此时peekpop手势都已经集成完毕,这时候还想实现类似在preview下面添加alert的操作,如系统message里面的快捷回复

8.png

其实只需要在previewController里面实现- (NSArray<id<UIPreviewActionItem>> *)previewActionItems方法即可.
PS:在xcode6.3时OC添加了制定数组元组类型的功能,有利于写出更加严谨的代码,好评~

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action1 click");
    }];
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action2 click");
    }];
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action3 click");
    }];
    
    
    UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"group1" style:UIPreviewActionStyleDefault actions:@[action1,action2]];
    UIPreviewActionGroup *group2 = [UIPreviewActionGroup actionGroupWithTitle:@"group2" style:UIPreviewActionStyleDestructive actions:@[action1,action3]];
    UIPreviewActionGroup *group3 = [UIPreviewActionGroup actionGroupWithTitle:@"group3" style:UIPreviewActionStyleSelected actions:@[action2,action3]];
    
//    NSArray *items = @[action1,action2,action3];
//    NSArray *items = @[group1,group2,group3];
    NSArray *items = @[action1,group1,action2,group2,action3,group3];
    return items;
}

有兴趣的话可以自己动手体会一下UIPreviewActionGroupUIPreviewAction的区别.

你可以在github下载到此源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 关于这篇文章 由于iPhone 6S发布不到一年的时间,很多新特性、新技术还未普遍,不管是3D Touch的...
    Tangentw阅读 4,576评论 8 18
  • 前言 关于3D touch苹果官方文档是这么开始介绍的: 大意如下:iOS9开始,所有新的手机都增加了一个三维的用...
    VV木公子阅读 2,260评论 3 39
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • 如果我辞职了会怎样,这是我一直都不敢面对的问题,也是我的恐惧所在。 我正在做着的是一份亲人朋友称羡的工...
    青_竹阅读 211评论 0 1
  • 有一天,爷爷把油画拿到了家里,·我们吃完饭后,就在家里画油画。 我画的是小猪佩奇和乔治,我从小猪的脸开始画,我把佩...
    嘉张怡2阅读 209评论 0 0