iphone - UILabel对setText的速度慢吗?

时间:2011-05-24 12:00:58

标签: iphone uiscrollview uilabel

我的代码很简单。我有一个UIScrollView,下面有五个UILabel。我在UIScrollView委托中设置的scrollViewDidScroll是scrollView移动的每150个像素,我在NSArray中用NSStrings更新了五个UILabel。

以下是代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    int offsetY = scrollView.contentOffset.Y;

    BOOL canUpdate = (offsetY % 150 == 0)?YES:NO;

    if (canUpdate) {

        int index = offsetY / 150;

        for (int i = 0;i < 5; i++) {

            UILabel *label = [labelArray objectAtIndex:i];
            label.text = [stringArray objectAtIndex:index];

        }

    } 
}

这很慢。我的意思是,如果我滚动很快(让我们说它可能需要在停止之前多次更新标签),我可以看到滚动滞后,就像阻止其移动一样。

UILabel setText真的那么慢吗?

感谢

3 个答案:

答案 0 :(得分:0)

不,它不慢。您应该尝试在scrollViewDidScroll委托方法中设置标签。

更新: 所以你的意思是它仍然无法工作!据我猜测,您正在尝试检查滚动视图是否滚动了150px然后更新了一些标签。

在您的代码中,您基本上检查精确的150 px值,因为您使用了模数(%)操作。 您不必总是滚动并且滚动视图偏移正好在150,300,450等。

答案 1 :(得分:0)

不,绝对。如果速度很慢,您将无法有效地使用iPhone上的联系人列表。

如果你的代码很慢,你应该寻找减慢滚动过程的其他代码片段。按照@pratikshabhisikar的建议切换到scrollViewDidScroll:方法也可能有所帮助。 尝试在scrollViewDidEndDecelerating:中打印一个日志,查看它被调用的次数。

答案 2 :(得分:0)

pratikshabhisikar说得对。

当您的contentOffset 完全 150的倍数(作为整数)时,您只更新了一个标签。

(offsetY % 150) 
仅当offsetY可被150整除并且不留余数时,

才返回true。因此,如果您滚动太快,该偏移量可能会跳过“最佳点”(150的倍数),您将无法获得更新。

尝试:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    int index = floor(scrollView.contentOffset.y / 150.0f);
    for (int i = 0;i < 5; i++) {

        UILabel *label = [labelArray objectAtIndex:i];
        label.text = [stringArray objectAtIndex:index];

    }
}

'floor'功能确保你在分割后将圆角版本作为int - 所以0到150之间的任何地方都会返回0等。

您可能也希望缓存最后加载的索引(因为您将重新加载当前任意数量的滚动文本(即只有index != mCurrentIndex才进入for循环。