【发布时间】:2012-12-07 04:02:57
【问题描述】:
我想要一个从右到左滚动的 UICollectionView,即当它在加载后出现在屏幕上时,集合视图应该首先显示最右边的单元格/项目,然后在左侧添加其余部分。我已经尝试过here 提出的解决方法,但是如果我在viewWillAppear: 中调用它,我会得到:
*** Assertion failure in -[UICollectionViewData layoutAttributesForItemAtIndexPath:], /SourceCache/UIKit/UIKit-2372/UICollectionViewData.m:485
如果我滚动到viewDidAppear: 中的最后一项,它工作正常,除了现在用户首先看到左边的项目,然后滚动到最后一项。还尝试在 UICollectionView 上使用 contentOffset 属性(因为它是 UIScrollView 的子类),但此参数也仅在 viewWillAppear: 和 viewDidAppear: 之间的某个时间设置
还有其他选择吗?我想我可以尝试继承 UICollectionViewFlowLayout 并从右到左布局单元格,但我有点急于进入那个领域。
这就是我的工作:
- (void)_scrollToTheRight
{
NSIndexPath *lastIndexPath = [self.fetchedResultsController indexPathForObject:self.fetchedResultsController.fetchedObjects.lastObject];
if (lastIndexPath)
{
[self.collectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionRight animated:NO];
}
}
每个值是:
lastIndexPath
(NSIndexPath *) $0 = 0x1f1754a0 <NSIndexPath 0x1f1754a0> 2 indexes [0, 21]
(NSInteger)[self.fetchedResultsController.fetchedObjects count]
(NSInteger) $3 = 22 [no Objective-C description available]
(NSInteger)[self.collectionView numberOfItemsInSection:0]
(NSInteger) $2 = 22 [no Objective-C description available]
最后一点:集合视图控制器是从由 UIPageViewController 放在屏幕上的视图控制器的容器视图(iOS 6 故事板中的新功能)加载的。
谢谢。
编辑 1:
所以我认为问题在于使用我的故事板布局(UICollectionViewController 使用新的容器视图嵌入)导致了问题。
因为在应用程序的其他地方我还嵌入了视图控制器(普通的UITableViewController)viewDidAppear: 在视图实际出现之前被调用。我怀疑这个设置没有正确通知每个子视图控制器他们应该加载和布局他们的视图。
【问题讨论】:
-
在我为您在链接中提供的答案所做的测试项目中,我在 viewDidLoad 中有 scrollToItemAtIndexPath: 方法(在创建集合视图之后)。我不知道这是否会有所作为。
-
谢谢,我认为问题不在于集合视图,而在于父视图控制器和子视图控制器之间的关系(参见我的编辑 1)。
-
我尝试将我的集合视图项目移动到容器视图中,如果我将代码放在 viewDidAppear:animated: 方法中,它工作正常。我在该方法中定义了数组、集合视图和滚动到结束代码。
标签: ios uiscrollview uistoryboard uicollectionview