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

TangramPageScrollLayout中的element重复添加问题 #39

Open
Feeeeeerny opened this issue Dec 21, 2017 · 9 comments
Open

TangramPageScrollLayout中的element重复添加问题 #39

Feeeeeerny opened this issue Dec 21, 2017 · 9 comments
Labels

Comments

@Feeeeeerny
Copy link

Feeeeeerny commented Dec 21, 2017

卡片内的组件数据源如果有变化,我通过 [TangramDefaultDataSourceHelper modelsWithLayoutDictionary:newLayoutDict] 生成了新的itemsModel,然后 [pageScrollLayoutView setItemModels:itemsModel] 后,执行 [TangramView reloadlayout:pageScrollLayoutView]pageScrollLayoutView 中原来的element不会被删除,也就是说会一直添加新的element,而且如果新的itemsModel.count = 0 的话,在 TangramPageScrollLayout 的方法 calculateLayout 中直接执行了

 if (nil == self.itemModels || 0 >= modelCount) {
        self.height = 0.f;
        return;
    }

把这个layoutView的高度赋成了0,但是以前的子试图还是存在的,导致以前的子试图还是会显示的。
所以这里两个现象:
1.在没有重新生成layoutView的情况下,局部更新该layoutView的组件数据源,刷新后,老得组件没有被删除,导致重复添加组件。
2.在没有重新生成layoutView的情况下,局部更新该layoutView的组件数据源且新的组件个数为0,这个layoutView高度为0,但是老得组件还是会显示出来。
这两个现象都是同一个问题造成的,就是更新itemsModel后,应该删除老的组件视图。

麻烦你这边验证一下。

@HarrisonXi
Copy link
Contributor

收到,会进行验证

@Feeeeeerny
Copy link
Author

补充一下,是在一个页面中有两个及两个以上的轮播布局卡片,才会出现这种情况,如果只有一个轮播布局的卡片是没问题的。

@HarrisonXi
Copy link
Contributor

已重现此问题,在排查中

@HarrisonXi
Copy link
Contributor

HarrisonXi commented Dec 22, 2017

和之前的研发沟通了一下,目前此 Layout 基本属于废弃状态。

最早的时候这个 Layout 是用来实现 Banner 的,所以要维持内部元素永驻内存(为了维持它滚出页面时的滚动 offset 状态),避免被重用导致各种问题。所以 pageScrollLayout 在添加元素时强制将内部元素的 reuseIdentifer 全部清空了,并且从来没有测试过 reloadLayout 之类的可能。

目前来看逻辑已经难以维护,有点接近上帝才知道的状态了……所以综合来说现在的建议:

  1. 如果是做 banner 可以考虑实现一个带滚动的 element(组件),配合 container-oneColumn 使用。(我们自己目前是这么做的)

  2. 对这个 Layout 整体取消重用方案,每次 reload 之前重新生成一次所有的 PageLayout。(这个方案类似临时补丁的效果)

  3. 重新实现一个合适的 PageLayout,这个目前对于我们来说优先级较低,如果你乐意的话,可以参与到开源建设中来。(不排除很久以后我会重写它的可能)

@HarrisonXi
Copy link
Contributor

可以尝试修复方案,注释掉我所注释的对应行:

- (void)addSubview:(UIView *)view
{
    if (view && view.reuseIdentifier) {
//        view.reuseIdentifier = @"";
        [self.scrollView addSubview:view];

注:并未经过充分测试

@Feeeeeerny
Copy link
Author

收到,谢谢。
目前天猫首页里面的Banner都是自己实现的element+oneColumn形式的?我感觉这种布局是非常常见有用的,还是需要提供这么个布局的。希望可以尽快完善哦~

@HarrisonXi
Copy link
Contributor

是的,element + oneColumn。

主要是这种 Layout 在需求上存在设计难点(而不是实现难点):

  1. banner 如果重用,可能存在多次上报曝光问题。所以 banner 控件最好由用户自行控制。
  2. 如果每次滚动到 PageLayout 处时它都回归原始状态,对 pageIndex != 0 的元素曝光量很不友好。但如果 Layout 本身需要维持 pageIndex 信息,违背了只进行“布局”的初衷。

比较难取舍。

@yoowei
Copy link

yoowei commented Apr 19, 2018

自己实现的element+oneColumn形式 ,现在一个页面有几个滚动布局的话,会出现数据混乱的现象,不知道是什么原因?

@HarrisonXi
Copy link
Contributor

@yoowei oneColumn应该不会出现类似情况,你可以另开一个问题说得更清楚点

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

No branches or pull requests

3 participants