Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

查看纵向滚动的列表元素时候会把本来显示的对象全部归还了&列表元素都不显示~ #175

Open
conyard opened this issue Jun 21, 2024 · 14 comments

Comments

@conyard
Copy link

conyard commented Jun 21, 2024

20240621-154615-bug.txt
这个是日志输出文件
当选中绑定的那个Scroll脚本的时候,就会出现。
很容易出现

@conyard
Copy link
Author

conyard commented Jun 21, 2024

LoopScrollRectBase.cs.txt
这个是加入了日志输出的源码和日志加入的地方图片

bug1
bug2

本来我是在显示列表中的对象,结果会给我全部隐藏。是为什么呢?

@conyard
Copy link
Author

conyard commented Jun 21, 2024

Master分支一样也有这个问题,纵向滚动了0.05的位置左右,结果把所有对象都归还了。
bug3

@qiankanglai
Copy link
Owner

请问具体的操作方式是?譬如使用DemoScene里的LoopScroll该如何复现,譬如VerticalScroll我尝试纵向拖拽了很小的距离 无法触发。
最好能文字清晰描述下操作步骤,或者提供简单录屏

@conyard
Copy link
Author

conyard commented Jun 24, 2024

QQ2024624-11151.mp4

这个是录屏,可以查看,前2次有问题,第三次就是正常的(没问题的情况)

@conyard
Copy link
Author

conyard commented Jun 24, 2024

QQ2024624-112215.mp4

还会遇到滚动过程中,对象消失的情况。

@qiankanglai
Copy link
Owner

实在抱歉最近一个月加班太猛orz 一直没时间腾出手相应issue
这个问题看上去像是滑动的太猛一下子出去了

  • 可以测一下LoopScrollRect的MovementType改成Clamp是否还能复现这个问题(如果是Unconstrained有问题是没办法的...)
  • 在demoscene中你可以滑出类似的效果么?我刚努力尝试了下还是没搞出来...

@conyard
Copy link
Author

conyard commented Aug 28, 2024

Demo已经创建好好了用到的资源是Samples/Demo下的资源.
Demo175Bug.zip
结构图片如下
Snipaste_2024-08-28_15-30-42

@conyard conyard changed the title 编辑模式下查看纵向滚动的列表元素的时候会把本来显示的对象全部归还了 查看纵向滚动的列表元素时候会把本来显示的对象全部归还了&列表元素都不显示~ Aug 30, 2024
@qiankanglai
Copy link
Owner

哈喽,我看了下Demo175Bug里的问题主要是HorizontalScroll_Grid的布局是Stretch
image
这样会导致无法正确获取对应的大小
image

快速改了下可以出来2个cell了
image

@conyard
Copy link
Author

conyard commented Sep 10, 2024

你这样修改虽然能修改好问题,但是有悖于:要做动态的适配。

左边的布局对象会导致列表的布局宽度或者高度不固定。

列表是否能获取到这个动态适配的高度或者宽度勒?

让使用者不用考虑当布局变化时列表宽高也动态变化(通过UGUI的适配,不用代码去设置宽高和位置)?

@conyard
Copy link
Author

conyard commented Sep 13, 2024

Snipaste_2024-09-13_16-08-36
还有个问题是,为什么点击这个刷新按钮界面的对象也显示出来了。我看了下,这个函数 RefreshCells
有效的相应就
UpdateBounds(true);
UpdateScrollbars(Vector2.zero);

其中 UpdateBounds 一致都生效的

@conyard
Copy link
Author

conyard commented Sep 13, 2024

Snipaste_2024-09-13_16-08-36

这么修改,可以解决问题,但这么做可能是不对的。需要你斟酌下。

LoopScrollRectBase.cs 脚本里面:

测试:
RefillCells 函数中加上:
LayoutRebuilder.ForceRebuildLayoutImmediate(viewRect); // 测试代码
float sizeToFill = GetAbsDimension(viewRect.rect.size) + Mathf.Abs(contentOffset);

上面的 ForceRebuildLayoutImmediate 是无效的,只能在 OnRectTransformDimensionsChange 函数 里面进行处理~

我加上了一个刷新列表的函数 RefreshCells() ,就解决了。但是,这样处理可能欠妥。需要你斟酌思考下。

@qiankanglai
Copy link
Owner

这个使用场景确实有点麻烦,核心就是整体布局变化导致loopscroll自己的大小变化了——我之前没处理这个使用场景的原因是,如果有不小心触发的loopscroll大小变化就带来一次刷新,会负担太重了(即使是RefreshCells也会对当前所有cells调用一遍ProvideData)。

通过监听OnRectTransformDimensionsChange确实能达到自适应布局LoopScroll之后自动刷一下cells的功能,但是我目前更倾向于这个行为靠外部手动调用: 我在考虑额外封装一个AdaptiveLoopScroll脚本来监听这个事件+触发刷新,使用这个的用户相当于明确知道潜在的风险;这个行为默认就不包含在LoopScroll里。

@conyard
Copy link
Author

conyard commented Sep 14, 2024

如果不刷新Cell,会导致:列表元素的显示问题(看起来不是那么的美观)。

这样做了,Demo测试不会出现问题。但项目工程里面有错误。错误如下

Trying to remove TextBuyCondition (Text) from rebuild list while we are already inside a rebuild loop. This is not supported.
Trying to remove Image (Image) from rebuild list while we are already inside a rebuild loop. This is not supported.

类似于与这个bug
#11

无语了~~

追了下代码,导致上面的错误,RefillCells 函数未完全执行完毕,就触发了 OnRectTransformDimensionsChange 的响应里加的刷新 RefreshCells 函数。

简单的测试了一个函数 RefillCells ,另外一个 RefillCellsFromEnd 没修改,
测试修改前代码点
Snipaste_2024-09-13_16-08-36

修改后
Snipaste_2024-09-14_12-49-22

删除了添加到 OnRectTransformDimensionsChange 中的刷新Cell的函数(避免报Trying to remove的错)

上面的修改是生效的,
下面的修改目前感觉是较为合理的,

只需要把 Canvas.ForceUpdateCanvases(); 函数放到

ReturnToTempPool(reverseDirection, m_Content.childCount); 之后,
float sizeToFill = GetAbsDimension(viewRect.rect.size) + Mathf.Abs(contentOffset); 之前 即可。
不用对 OnRectTransformDimensionsChange 进行 修改(即不用添加刷新函数 RefreshCells)。

已验证。你看下是否合理~

@qiankanglai
Copy link
Owner

非常抱歉最近一段时间实在抽不出手来处理,等忙完项目会来跟进orz...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants