热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tableView嵌套tableView的功能实现

前言以前公司做过一个tableView嵌套tableView滚动的功能实现。今天特意重新的整理了一下这个功能的实现。功能需求说明:

前言

以前公司做过一个tableView嵌套tableView滚动的功能实现。今天特意重新的整理了一下这个功能的实现。

功能需求说明:

  • 顶部是一个banner图片
  • 侧边栏
  • 内容tableView
    具体的实现效果图如下:

    tableView嵌套tableView的功能实现
    功能需求.gif

    这个功能一开始的实现的方式是采用的ScrollView嵌套TableView实现的。又重新的写了一下这个功能模块。这次采用的是tableView嵌套tableView实现的此功能。
    特别说明
    文章中实现的功能和此功能略有差异,但实现的思路是一样的

具体实现

在说明实现方法之前先上一下现在的效果图

tableView嵌套tableView的功能实现
效果图.gif

功能实现部分
1.创建一个主控制器MainController

  • 给当前视图添加一个是否可以滚动的参数canScroll。关于这个参数的使用后面再做说明
  • 控制器创建一个tableView
  • 给tableView实现相关的代理方法
  • tableViewCell的数量为1
  • 给tableView设置headerView
  • tableView设置SectionHeaderView。这个地方的headerView是为了满足多个标题而准备的。如果不需要这个标题只需要一个banner的话完全可以使用ScrollView+tableView来实现这个功能就可以了。
    特别注意:
    关于Cell高度的设置应该是一个屏幕的高度 – SectionHeaderView的高度。或者说是你当前tableView的高度 -SectionHeaderView的高度。当前tableView的ContentSize的大小应该是tableHeaderView的高度+tableView的高度 – SectionHeaderView的高度

2.自定义tableViewCell
我这里要实现左右滑动切换tableView所以用到了一个ScrollView。如果没有多个标题的需求的话是不需要这个ScrollView的

  • 创建一个ScrollView
  • ScrollView的高度值和你当前Cell的高度一致,宽度根据你的标题个数设置。我这里是两个标题所以我的宽度应该是屏幕宽*2
  • 创建两个tableView添加到ScrollView上面去。tableView的高度和ScrollView高度一致。宽度是屏幕宽

至此页面的样式写完了。
这个时候运行程序的时候会发现上面的tableView和下面的tableView的滚动存在冲突

3.解决tableView嵌套滚动冲突的问题

  • 自定义一个新的tableView
  • tableView实现UIGestureRecognizerDelegate
  • tableView实现UIGestureRecognizerDelegate中的这个方法gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
  • 判断方法中gestureRecognizerotherGestureRecognizer是否为UIPanGestureRecognizer 是的话返回true,不是的话返回false。这个地方其实也可以直接返回True
    代码如下
import UIKit

class BaseTableView: UITableView , UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return gestureRecognizer.isKind(of: UIPanGestureRecognizer.self) && otherGestureRecognizer.isKind(of: UIPanGestureRecognizer.self)
    }
}

4.实现丝滑滚动

我相信很多第一次接触这个功能的时候,很多人想到的方法是利用tableView的ScrollEnable属性来解决滚动冲突的问题千万不要这样做。千万不要这样做。千万不要这样做。一旦你这么做了的话,后果就是当你发现要切换两个视图的ScrollEnable属性的时候会出现明显的卡顿情况。
正确的做法应该是设置tableView的contentOffset的值

  • 设置MainControllerscrollViewDidScroll方法,当滚动高度大于等于tableHeaderView高度的时候设置tableView的contentOffsetY的高度一直为tableHeaderView的高度。一开始设置的呢个canScroll属性就起作用了。具体代码如下:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //如果高度大于等于tableHeaderView的高度的时候
        if scrollView.contentOffset.y >=  HEADER_HEIGHT{
            //设置ContentOffsetY的高度为tableHeaderView的高度
            scrollView.cOntentOffset= CGPoint(x: 0, y: HEADER_HEIGHT)
            if self.canScroll {
                self.canScroll = false//设置是否可以滚动的参数为false
                //发送通知给子tableView。设置子tableView的可滚动属性为true
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ChilderNotice"), object: nil)
            }
        }else{
            if !self.canScroll {
                scrollView.cOntentOffset= CGPoint(x: 0, y: HEADER_HEIGHT)
            }
        }
    }
  • 设置子tableView的滚动事件。具体代码如下:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        //开始的时候子视图是无法滚动的  canScroll属性为false
        if !self.canScroll{
            scrollView.cOntentOffset= CGPoint.zero
        }
        //如果子视图的滚动高度小于等于0证明子视图滚动到了头部
        if scrollView.contentOffset.y 

5.完整的代码下载地址

完整代码下载地址

6.感谢a1203302261提供的代码优化

tableView嵌套tableView的功能实现
效果图1.png
tableView嵌套tableView的功能实现
效果图2.png
tableView嵌套tableView的功能实现
效果图3.png

百度网盘:9vxh
github
此优化由简书用户@a1203302261提供。在此只做总结方便下载


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
author-avatar
低调酥紫_631
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有