3

我正在尝试实现一个表格视图,它应该根据 UISlider 的值显示单元格。

示例:该表是空的。用户快速将滑块拖动到 400 的值。现在表格应该包含 400 行。

单元格应显示的数据存储在核心数据中,大约有 400 个条目。我们试图在拖动滑块时获得一种很酷的效果,这样您就可以直观地看到每个被添加的单元格(当然,如果您正在查看单元格最终所在的表格视图部分)。使用时提供的内置动画- (void) reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation就足够了,在 1 到 10 行之间的效果看起来很酷。

问题:值达到 10 或更多后,它开始滞后太多而无法工作。我认为这是因为 reloadSections: 每次滑块更改值时都必须检查每个单元格,而我浪费了太多宝贵的时间。

所以,我正在寻找有关如何实现这一点的想法。我是否应该使用 NSFetchedResultsController 并在每次滑块更改值时更改获取请求(每秒可能发生 20 次)?我是否应该将所有数据加载到一个数组中并以标准方式重用单元格?

我已经尝试了两种方法,并且延迟几乎相同。我在想问题可能是 reloadSection: 太慢了。我认为这- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation将是一个更好的选择,但我正在寻找更多关于如何实现这一点的想法。

任何帮助,将不胜感激!

我在滑块更改值时测试的最后一个代码:

- (IBAction) sliderChangedValue:(UISlider *)slider
{
    // Make sure we only run this function on integer changes. It fires too often on float changes.
    if ((int)slider.value == lastSliderIntegerValue) {
        return;
    }

    if (slider.value > lastSliderIntegerValue) {

        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(int)slider.value inSection:0]] 
                              withRowAnimation:UITableViewRowAnimationAutomatic];
    }

    else {
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(int)slider.value inSection:0]]
                              withRowAnimation:UITableViewRowAnimationAutomatic];
    }

    lastSliderIntegerValue = (int)slider.value;
4

1 回答 1

2

我对 iOS 开发的经验并不丰富,但我做过很多游戏开发。您的问题的根源似乎是您的程序必须渲染的动画量。既然你说你开发这个程序的动机是保持酷炫的效果,那么你应该尽可能地改变你的程序来优化你的程序,直到用户可以感知到的程度。我知道这不是很清楚,所以这是一个可能的解决方案:

您不应该为用户可以移动滑块的每种速度添加每一行的动画。相反,只需为体验流畅所需的数量设置动画即可。这可以通过计算滑块更改的速率来完成,然后在调用 reloadData 之前调整向表中添加的行数。仅对循环中最后一行的添加进行动画处理。

因为我不知道您正在为什么系统开发,或者根本不知道各种 iOS 平台的图形功能,所以我无法真正给您具体的值,但您应该尝试不同的设置,看看哪些有效.

于 2012-06-21T18:27:05.330 回答