iOS实现微信列表长按效果

不知道大家有没有发现微信聊天历史列表、苹果自带的通讯录历史记录等应用如隐藏的长按功能。哈哈,如果没有也不要气馁,也不要怀疑人生。要不就要换手机了,要不就要升级系统了!

这个功能看着挺炫的,也挺方便的吧,如果看历史记录等等其他快捷操作的一个入口。如果没有想到正确的实现方法,可能会实现起来很难,或者效果没有这么好。如果找到了正确的方法,其实实现起来非常简单。

其实这个效果就是利用了苹果的3Dtouch,不支持3Dtouch的手机或系统就没法体验到了。

卖了一个大关子,也索罗了一顿,接下来让我看看如何实现的。哈哈。

给需要的UIView注册3DTouch行为

[self registerForPreviewingWithDelegate:self sourceView:cell];

这个方法其实就是UIViewController的方法,最后一个参数就是指定需要添加3DTouch的View,这里我们要加的是我们自己的tableviewcell.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    MYTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MYTableViewCell" forIndexPath:indexPath];
    [self registerForPreviewingWithDelegate:self sourceView:cell];
    return cell;
}

实现UIViewControllerPreviewingDelegate协议

这个协议有两个方法我们都要实现

  • 第一个- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    PreViewController *vc = [[PreViewController alloc] init];
    return vc;
}

这个协议方法就是我们3DTouch之后要显示的视图,想显示什么就自己实现,完全可以由自己来控制

  • 第二个- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    [self showViewController:viewControllerToCommit sender:self];
}

这个协议方法就是将我们的视图显示出来


华丽的分割线,到这里基本就实现了长按弹出视图的效果,细心的人可能发现其实还有一个效果就是长按出现视图之后可以向上滑动出现,之后出现了几个按钮。接下来让我们看看怎么加上那几个按钮。

其实加这几个按钮也非常简单。找到我们之前定义的PreViewController这个类,然后重写-(NSArray<id<UIPreviewActionItem>> *)previewActionItems 这个方法也是UIViewController中本身自带的。

-(NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *p1 = [UIPreviewAction actionWithTitle:@"删除" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"点击了删除");
    }];


    UIPreviewAction *p2 = [UIPreviewAction actionWithTitle:@"撤销" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"点击了撤销");
    }];

    return @[p1,p2];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 15,907评论 4 61
  • 似乎从来都没有好事发生,她蹬着没有电的电动车,丧气地想。 比骑到一半就没电的电动车相比,更悲惨的,是男朋友就这样抛...
    桃小圈阅读 503评论 0 1
  • 分号的使用1.功能性语句后面必须加分号; 但如果是紧邻?>,分号可以省略;2.结构性语句后面不能加分号; 变量的使...
    青鸟evergreen阅读 176评论 0 0
  • 正确付出和收获成正比,不努力又有好回报的事情从来不存在。 如何正确付出?把做事的核心列出,逐步刻意练习到熟...
    斐丽希娅阅读 301评论 0 0
  • 在今天之前,我三十多年的人生里从来没有想过去回想或发现自己的成就事件,总认为不管大成就还是小成就并不会给生活和工...
    丽享成长阅读 399评论 0 0

友情链接更多精彩内容