0

我正在构建一个字典应用程序,其中一个功能是您可以“深入”到定义中。您查找一个词,定义中有一个您不理解的词,因此您点击该词,应用程序会显示该词的定义(如果有)。如果有人熟悉的话,这对于 App Store 上的 iOS 词典应用程序来说是相当标准的。

一个特点是,当你向下钻取时,我将有一个显示每个单词的栏,所以你会在这个水平栏上得到一种单词“链”。这个想法是您可以点击链中的单词以在您的单词链中向前和向后导航。

为了表示这个链,我使用了一个 UICollectionView,它带有一个子类 UICollectionViewController。因为它本质上是一个单行的“网格”,所以这对我来说很有意义。我使用的是故事板,所以我只是将我的自定义控制器嵌入到主视图中,在主控制器和这个自定义集合控制器之间来回传递事件。很简单。

现在,假设用户点击了许多不同的词,所以你会得到 UICollectionViewCells 的“链”从左到右在栏上增长,直到你到达边缘。由于 UICollectionView 基于/有一个 UIScrollView,这应该不是问题。我的概念是,如果要显示的项目数超过视图的宽度,CollectionView 将扩展 contentView 并将项目放置在视图端口的右边缘,然后我可以以编程方式滚动视图以显示新的添加项目。

这是我用来执行此操作的代码(已编辑)。这是我在子类 UICollectionViewController 中调用的方法:

- (void)reloadDataWithAnimation
{
    [self.collectionView performBatchUpdates:^{
        [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
    } completion:^(BOOL finished) {
            [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:model.data.count - 1 inSection:0]
                                        atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
        }

    }];
}

这或多或少是我通常对 UITableView 所做的:告诉它在我更改模型后重新加载其数据。起初它并没有很好地工作,直到我发现一个关于 SO 的问题涵盖了 的使用performBatchUpdates,并且在scrollToItemAtIndexPath我意识到它需要进入完成块之前我很难做到这一点。

现在,这是时髦的部分:在项目填满整个视图之前一切正常。当一个项目第一次超出边界时,CollectionView 将该项目放在该行中最后一个项目的下方。这看起来真的很奇怪,因为视图只有一排高,所以你可以看到一半停在该排最后一个下方的项目,大部分是模糊的。不会发生滚动。

此时,如果您来回滚动 CollectionView,项目会重新配置自身并移动到正确的位置。或者,如果您添加另一个项目,它们会正确对齐并且视图会按预期滚动。连续添加工作正常。但是,如果您向后滚动到左侧然后添加另一个项目,它会短暂出现在视口中最后一个当前可见项目的下方,然后视图会滚动到最右侧,并且当它滚动时,放错位置的项目会跳到正确的位置.

4

1 回答 1

0

虽然我开始发布这个问题是因为我在 Stack Overflow 上找不到任何东西,但在写我的问题的过程中,类似问题侧边栏更新了,我发现了类似的问题,并最终得到了答案。

类似的问题:UICollectionView 单元格布局超出了集合视图的范围

苹果显然知道这个问题。

这是上述问题中链接到的解决方案:https ://stackoverflow.com/a/13389461/700471

Nick Snyder 发布的代码完美地为我解决了这个问题。

编辑:此外,最后我将 UICollectionViewLayout 子类化,绕过 FlowLayout,并使用本教程制作了自己的布局。

于 2013-06-14T20:43:45.783 回答