2016-01-13 55 views
0

我有一个CollectionView(垂直)在一个ScrollView里面,使它可以在两个方向上滚动。更改UICollectionView大小没有viewDidLayoutSubviews

用户需要选择在房间里的座位上,房间里可以有任意数量的列和行,我需要整理座位

如果我把值(800例)在集合视图宽度上viewDidLayoutSubviews它的工作原理

- (void)viewDidLayoutSubviews { 
self.collectionView.frame = CGRectMake(0, 0, 800, self.collectionView.frame.size.height); 
self.scrollView.contentSize = self.collectionView.frame.size; 

} 

的问题是,我加载一个异步任务的席位,而如果我使用

self.collectionView.frame = CGRectMake(0, 0, 113*columns, 113*rows); 
self.scrollView.contentSize = self.collectionView.frame.size; 

负荷日以后e座位它不起作用。

我不能把尺寸放在viewDidLayoutSubviews因为我不知道还有多少个座位!

加载数据后我该怎么做?

回答

1

收到数据后,您可以拨打setNeedsLayoutlayoutIfNeeded。这将要求视图更新子视图的布局更新,这将触发viewDidLayoutSubviews的呼叫。

请注意,您需要更新viewDidLayoutSubviews方法,以考虑columnsrows的新值。

两者之间的差异是layoutIfNeeded立即生效,而setNeedsLayout将在下一个更新周期中触发重新布局。性能明智的setNeedsLayout是首选,它也可以合并多个布局失效,但是,如果您有动画或不具有动画,layoutIfNeeded可能更可取。

+0

我也试过这个,但它不工作,它让我滚动视图,但项目仍然堆叠在2列 – D4rWiNS

+0

您是否更改'viewDidLayoutSubviews'实现以考虑新的'列'和'行价值观?或者它使用硬编码的'800'值? – Cristik

+0

好吧,我改变了你说的,它的工作原理!谢谢! – D4rWiNS