【问题标题】:Change UICollectionView size without viewDidLayoutSubviews在没有 viewDidLayoutSubviews 的情况下更改 UICollectionView 大小
【发布时间】:2016-01-13 10:26:27
【问题描述】:

我在ScrollView 内有一个CollectionView(Vertical),以使其可双向滚动。

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

如果我在 viewDidLayoutSubviews 的集合视图上设置宽度值(例如 800),它会起作用

- (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;

加载座位后它不起作用。

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

加载数据后我该怎么做?

【问题讨论】:

    标签: ios objective-c uiscrollview uicollectionview


    【解决方案1】:

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

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

    两者的区别在于layoutIfNeeded是即时生效的,而setNeedsLayout会在下一个更新周期触发重新布局。性能方面setNeedsLayout 是首选,它还合并多个布局失效,但是根据您是否有动画,layoutIfNeeded 可能更可取。

    【讨论】:

    • 我也试过这个,但它不起作用,它让我滚动视图,但项目仍然堆叠在 2 列中
    • 您是否更改了viewDidLayoutSubviews 实现以考虑新的columnsrows 值?还是使用硬编码的800 值?
    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 2019-11-09
    • 2017-03-20
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多