【问题标题】:poor performance of scrollview inside tableview iostableview ios中滚动视图的性能不佳
【发布时间】:2014-01-04 01:08:35
【问题描述】:

我对表格视图及其响应有疑问,因为每个单元格都有带有 72 个标签的滚动视图。我知道 scrollView 需要首先加载所有元素,然后加载到屏幕上,并且由于该表视图很慢,但是有没有办法在每次创建标签时不分配和调用 initWithFrame 方法?我尝试重复使用不同框架的标签,但它不起作用。

这是我需要以某种方式优化以更快地创建标签的代码。

    int listSize = 36;

    for(int i=0;i<listSize;i++){
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0+i*200, 0, 200, 80)];
        label.text = @"HELLO";
        label.textColor = [UIColor blackColor];
        label.backgroundColor = [UIColor clearColor];
        label.textAlignment = NSTextAlignmentCenter;
        label.font = [UIFont fontWithName:@"ArialMT" size:18];
        [scrolView addSubview:label];

        UILabel *grayBorderInFront = [[UILabel alloc] initWithFrame:CGRectMake(2+i*200, 5, 1, scrolView.frame.size.height-10)];
        grayBorderInFront.text = @"";
        grayBorderInFront.backgroundColor = [UIColor lightGrayColor];
        [scrolView addSubview:grayBorderInFront];
    }

【问题讨论】:

  • 你想达到什么目标?也许如果您向我们展示一些代码,我们可以帮助您。
  • 我希望我的数据可以在滚动视图(左右)中滚动,但我也想通过列表视图向下滚动。但是现在我上下或上升都太慢了。
  • 您应该继承 UITableViewCell 的子类,而不是为每个单元格创建新标签,并在表格滚动时重置文本。您可以覆盖 prepareForReuse 将单元格重置为默认状态,然后只需设置该行的标签文本。
  • 仅将可见标签放入视图中。然后实现委托函数scrollviewdidscroll,并在它们需要变得可见时创建新标签。

标签: ios objective-c uitableview memory uiscrollview


【解决方案1】:

将标签保存在数组中,然后将它们添加到视图中。或者你甚至可以缓存整个滚动视图。

编辑: 您保留一个正在更新的值的列表。对于在滚动视图中创建的所有标签,您设置标签 label1.tag = 4; (从 1 而不是 0 开始,因为 0 是默认值,其他视图也有)。

然后,在您的 cellForViewAtIndexPath 中,不是每次都创建一个新标签,而是使用 [cell viewWithTag:] 获取标签,并获得标签的引用。您唯一需要做的就是更改标签的值。您也可以将标签用作数组中的索引:

int index = 3; // third label
[(UILabel*)[cell viewWithTag:index+1] setText:[myLabelsArray objectAtIndex:index]];

【讨论】:

  • 我创建了 72 个标签仅用于测试。我需要一些来自服务器的数据,标签的数量将是随机数,所以我无法创建数组。
  • 每次进入该视图时,我都会收到来自服务器的更新并显示内容。一段时间后列表和滚动不会刷新。
  • 是的,我的建议是缓存对象,因此您不必一直取消/分配它们。您仍然可以更改它们的值...
  • 我尝试创建标签数组,但现在它们没有显示。我当时只能在 1 个滚动视图中看到标签。
【解决方案2】:

几周前,我使用带有自定义布局的 collectionView 为 iPhone 应用程序实现了 EPG 布局。 在 iPad 应用程序上,其他开发人员使用带有 collectionView 流布局数组的 scrollView 实现了 EPG。

自定义布局效果更好。

您提到您需要 iOS 5,因此您可以尝试以下开源替换集合视图: https://github.com/steipete/PSTCollectionView

【讨论】:

    【解决方案3】:

    你总是可以有一个 TableView 并且每个Cell 有一个水平的 CollectionView。

    将滚动方向属性设置为水平并使用UIViewCollectionFlowLayout

    CollectionView 将保证您的标签(即单元格)被重复使用,并且您的工作效率很高。

    【讨论】:

    • 我知道,但是我的要求是 iOS 5。
    • 嗯,你也可以使用水平tableview - stackoverflow.com/questions/2834840/…
    • 基本思想是创建EPG,左边有cannel图像,右边有可滚动部分,以便用户可以滚动时间线并查看程序。我不需要整个表格来滚动,只需 1 个部分(每个单元格中的滚动视图)。
    • 人们为 iOS 4.3 移植了 CollectionView(也许它甚至可以在 iOS 4.0 中使用,我没有测试过):github.com/steipete/PSTCollectionView
    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多