我的代码很简单。我有一个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真的那么慢吗?
感谢
答案 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循环。