iOS中多个tableView 嵌套滚动特性探索

嵌套滚动的机制

目前的结构是这样的,整个页面是一个大的tableView,
Cell 是整个页面的大小,cell 中嵌套了一个tableView
通过测试我们发现滚动的时候,系统的机制是这样的,
我们滑动内部小的tableView, 开始滑动的时候,如果内部小tableview没有滑到最大偏移量(contentSize.height - bounds.size.height)
我们滑动
内部小的tableView的时候, 如果该方向上外层tableView没有滚动到
最后一个(向上滚动的时候是第一个), 则内部tableView滚动到最大偏移量的时候直接带动外层
tableView滚动,如果外城是pagingEnabeled 的话,则外层的展示一个弹性效果,
如果内部的滚动到边界的时候,外层的tableView已经滚动到头了,则内部的tableView
展示一个弹性效果。

如果我们开始滑动内部小的tableView的时候,tableView在该方向上已经滚动到头了,则直接执行外层tableView的滚动,
如果外层在该方向上没有到头,则滚动外层tableView, 如果外层tableView在该方向上已经滚动到头了,则外层tableView
展示一个弹性效果

这个时候就有一个问题,就是正常的情况下,如果我们滑动内部 小的tableView, 如果开始滑动的时候, 内部的tableView 没有滚动
到尽头,我们滑动其滚动到尽头的时候,根据上面的机制,就会带动外层的tableView滚动,这是我们不想看到的,
所以我们可以这样, 内部的tableView没有滚动到尽头的时候,开始拖动这个时候,会执行内层的begindragging, 如果,
开始拖动的时候,内部的tableView已经滚动到尽头了,则会直接执行外层begindragging, 由此,我们可以
在内层tableView 的 begingdragging 代理方法开始执行的时候,禁止外层的tableView滚动,在内层的停止滚动之后,
再允许外层的滚动

这个效果图是自然状态下的效果
请添加图片描述

这个效果是经过我们处理之后的效果,滑动内部的时候,不会
引起外层的滚动
请添加图片描述

//
//  LBDouyinCell.m
//  TEXT
//
//  Created by mac on 2024/7/7.
//  Copyright © 2024 刘博. All rights reserved.
//#import "LBDouyinCell.h"@interface LBDouyinCell () <UITableViewDelegate, UITableViewDataSource>@property (nonatomic, strong) UITableView *commentTableView;@property (nonatomic, strong) UILabel *titleLabel;@end@implementation LBDouyinCell- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {[self setUpUI];}return self;
}- (void)setUpUI
{[self.contentView addSubview:self.commentTableView];[self.contentView addSubview:self.titleLabel];[self.commentTableView reloadData];
}- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{self.parentTableView.scrollEnabled = NO;NSLog(@"阿哈哈哈内层的内层的scrollViewWillBeginDragging");;
}- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{NSLog(@"哈哈哈哈哈内层的内层的scrollViewDidScroll");
}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{self.parentTableView.scrollEnabled = YES;
}- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{if (!decelerate) {//self.parentTableView.scrollEnabled = YES;}
}#pragma mark - UITableViewDelegate, UITableViewDataSource- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return 5;
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return 60;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([UITableViewCell class])];cell.textLabel.text = [NSString stringWithFormat:@"哈哈哈这里是第%ld条", indexPath.row];return cell;
}- (void)updateWithTitle:(NSString *)title
{self.titleLabel.text= title;
}#pragma mark - lazy load- (UILabel *)titleLabel
{if (!_titleLabel) {_titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 200, 50)];_titleLabel.backgroundColor = [UIColor magentaColor];_titleLabel.text = @"我是标题";}return _titleLabel;
}- (UITableView *)commentTableView
{if (!_commentTableView) {_commentTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 400, 200, 200) style:UITableViewStylePlain];_commentTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;[_commentTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:NSStringFromClass([UITableViewCell class])];_commentTableView.delegate = self;_commentTableView.dataSource = self;}return _commentTableView;
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end

这里demo link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

设置某些路由为公开访问,不需要登录状态即可访问

在单页面应用&#xff08;SPA&#xff09;框架中&#xff0c;如Vue.js&#xff0c;路由守卫是一种非常有用的功能&#xff0c;它允许你控制访问路由的权限。Vue.js 使用 Vue Router 作为其官方路由管理器。路由守卫主要分为全局守卫和组件内守卫。 以下是如何设置路由守卫以允…

k8s 部署RuoYi-Vue-Plus之mysql搭建

1.直接部署一个pod 需要挂载存储款, 可参考 之前文章设置 https://blog.csdn.net/weimeibuqieryu/article/details/140183843 2.部署yaml 先创建命名空间ruoyi kubectl create namespace ruoyi创建部署文件 mysql-deploy.yaml --- apiVersion: v1 kind: PersistentVolume …

【论文阅读笔记】Meta 3D AssetGen

【论文阅读笔记】Meta 3D AssetGen: Text-to-Mesh Generation with High-Quality Geometry, Texture, and PBR Materials Info摘要引言创新点 相关工作T23D基于图片的3d 重建使用 PBR 材料的 3D 建模。 方法文本到图像:从文本中生成阴影和反照率图像Image-to-3D:基于pbr的大型重…

搭建NEMU与QEMU的DiffTest环境(动态库方式)

搭建NEMU与QEMU的DiffTest环境&#xff08;动态库方式&#xff09; 1 DiffTest原理简述2 编译NEMU3 编译qemu-dl-difftest3.1 修改NEMU/scripts/isa.mk3.2 修改NEMU/tools/qemu-dl-diff/src/diff-test.c3.3 修改NEMU/scripts/build.mk3.4 让qemu-dl-difftest带调试信息3.5 编译…

C语言实现字符串排序

如果只有英文字符且不区分大小写的话按照字典序排序可以用strcmp函数&#xff0c;两个字符串自左向右逐个字符相比&#xff08;按ASCII值大小相比较&#xff09; strcmp(s1,s2) 当s1<s2时&#xff0c;返回为负数&#xff1b; 当s1s2时&#xff0c;返回值 0&#xff1b; …

安卓的组件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【Linux】打包命令——tar

打包和压缩 虽然打包和压缩都涉及将多个文件组合成单个实体&#xff0c;但它们之间存在重要差异。 打包和压缩的区别&#xff1a; 打包是将多个文件或目录组合在一起&#xff0c;但不对其进行压缩。这意味着打包后的文件大小可能与原始文件相同或更大。此外&#xff0c;打包…

Win10精英控制器2代青春版 设备删除失败,蓝牙连接断断续续

前提 更新了主板rog z790带WiFi、蓝牙&#xff0c;但是精英控制器连上老师断断续续。 过程 在设备管理中尝试了卸载、重装主板对应的蓝牙驱动&#xff0c;怎么都不行&#xff0c;都已经想放弃了。 但是想起来之前主板没有蓝牙&#xff0c;用的是绿联的USB蓝牙接收器&#xf…

Ubuntu24.04修改系统的环境变量

apache/tomcat配置要用到JDK&#xff0c;使用torch有时也会用到系统库&#xff0c;涉及到环境变量 1. 查看环境变量 cat /etc/environment2. 新建环境变量 sudo nano /etc/environment在文件底部添加新的环境变量 MY_VARIABLE"your_value"3. 修改环境变量 临时—…

数字化精益生产系统--APS 排程管理系统

APS&#xff08;Advanced Planning and Scheduling&#xff09;排程管理系统&#xff0c;即高级生产计划与排程系统&#xff0c;是一种高度智能化的计划和排程系统。它通过整合各种生产和供应链数据&#xff0c;运用先进的算法和数据模型&#xff0c;根据各种约束条件&#xff…

MySQL篇三:数据类型

文章目录 前言1. 数值类型1.1 tinyint类型1.2 bit类型1.3 小数类型1.3.1 float1.3.2 decimal 2. 字符串类型2.1 char2.2 varchar2.3 char和varchar比较 3. 日期类型4. enum和set 前言 数据类型分类&#xff1a; 1. 数值类型 1.1 tinyint类型 在MySQL中&#xff0c;整型可以指…

排队系统、Head and Tail of the Queue 题目

题目 JAVA40 排队系统描述输入描述&#xff1a;输出描述&#xff1a; 分析&#xff1a;代码&#xff1a; JAVA41 Head and Tail of the Queue&#xff08;队列的头和尾&#xff09;描述输入描述&#xff1a;输出描述&#xff1a; 示例:分析&#xff1a;代码&#xff1a;大佬代码…

【Java13】包

“包”这个机制&#xff0c;类似于分组。主要作用是区分不同组内的同名类。例如&#xff0c;高三三班有一个“王五”&#xff0c;高二八班也有一个“王五”。高三三班和高三八班就是两个不同的包。 Java中的包&#xff08;package&#xff09;机制主要提供了类的多层命名空间&…

MISRA C2012学习笔记(6)-Rules 8.11

文章目录 8.11 指针类型转换(Pointer type conversions)Rule 11.1 不能在函数指针和任何其他类型指针之间进行转换Rule 11.2 不得在指向不完整类型的指针和其他任何类型间进行转换Rule 11.3 不得在指向不同对象类型的指针之间执行强制转换Rule 11.4 不得在指向对象的指针和整数…

HTTP长连接

长连接优点 HTTP为什么要开启长连接呢? 主要是为了节省建立的时间,请求可以复用同一条TCP链路,不用重复进行三握+四挥 如果没有长连接,每次请求都做三握+四挥 如果有长链接,在一个 TCP 连接中可以持续发送多份数据而不会断开连接,即请求可以复用TCP链路 长连接缺点 …

第六十八回 东平府误陷九纹龙 宋公明义释双枪将-文心大模型ernie-speed免费使用方法

宋江和卢俊义抓阄儿&#xff0c;宋江打东平府&#xff0c;卢俊义打东昌府&#xff0c;谁先打下谁做梁山泊主。宋江带领林冲、花荣、刘唐等二十八人&#xff0c;卢俊义带领吴用、公孙胜、关胜等二十八人。 宋江等人到了东平府外安山镇&#xff0c;郁保四和王定六自告奋勇去下战…

比Elasticsearch更高效的开源搜索引擎Meilisearch——筑梦之路

功能说明 快速与高效&#xff1a; Meilisearch 旨在提供快速的搜索速度。它可以在毫秒级别内返回查询结果&#xff0c;即使在处理大型数据集时也是如此。 例如&#xff0c;在官方提供的基准测试中&#xff0c;使用 Meilisearch 处理 10 万个文档时&#xff0c;平均搜索时间为 …

vue3制作轮播图+vue轮播图的图片引入方式

对应的<teemplate> <template><div class"box"><ul class"ul1" ref"ul1"><li v-for"(img, idx) in images" :key"idx" :style"{ zIndex: img.zIndex }"><img :src"img.s…

深度学习驱动的中文情感分析:PlugLink 在实践中的桥梁作用

深度学习驱动的中文情感分析&#xff1a;PlugLink 在实践中的桥梁作用 情感分析技术则如同滤网&#xff0c;帮助我们从这股洪流中筛选出有价值的情感信号。特别是对于中文这样的多音字、同音词丰富且语境复杂度高的语言&#xff0c;深度学习模型展现了无与伦比的优势。本文将以…