UICollectionView 内容未正确调整大小

Posted

技术标签:

【中文标题】UICollectionView 内容未正确调整大小【英文标题】:UICollectionView content not resizing properly 【发布时间】:2015-04-23 11:01:00 【问题描述】:

我在静态表格视图单元格内使用集合视图,并且我正在使用自动布局来定义集合视图的框架。另外,我使用 FlowLayout 作为 collectionViewLayout。

问题:

该行为与 iPhone 4s 和 5 屏幕的预期相同。 (相同宽度) 一旦宽度发生变化(iPhone 6 和 6 Plus),集合视图会正确调整大小,但内容会保持其大小。 单元格和部分都会发生这种情况。

额外信息:

我将collectionViewLayout minimumInteritemSpacingForSectionAtIndex 设置为零。

单元格的宽度始终设置为tableView.frame.size.width / 2

我在哪里配置布局:

CGFloat headerHeight = 52;

collectionViewLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
collectionViewLayout.headerReferenceSize = CGSizeMake(self.width, headerHeight);

这就是现在的样子。绿色部分代表 UICollectionView。黑色和蓝色的细胞。分割线应调整大小,单元格应分为 2 列。

【问题讨论】:

您是否对自定义集合视图单元格内的子视图应用了约束? 你在哪里设置单元格的宽度?您使用的是 collectionViewFlowLayout 委托方法还是其他方法? @NileshMahajan 是的。对于单元格和部分(这是一个自定义的 reusableView) @CatalinaT。我添加了配置布局的部分。不过,我不使用任何 FlowLayout 委托方法。 【参考方案1】:

从您发布的代码中,您只是设置标题的大小,但我想您也有类似

collectionViewLayout.itemSize = CGSizeMake(self.collectionView.frame.width/2, height);

重要的部分是您使用哪种方法配置它,因为如果您在 viewDidLoad 中进行配置,则视图尚未正确布局,因此无论您在哪个设备上运行应用程序,宽度都将只是故事板中设置的宽度.

解决方案是将上面的代码放在viewWillLayoutSubviews

- (void)viewWillLayoutSubviews 
    [super viewWillLayoutSubviews];
    collectionViewLayout.itemSize = CGSizeMake(self.collectionView.frame.width/2, height);
    collectionViewLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.width/2, height);

另一种方法是实现 flowLayout 委托方法:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
    return cCGSizeMake(collectionView.frame.width/2, CUSTOM_HEIGHT);


// The same for the header 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section 
    return cCGSizeMake(collectionView.frame.width/2, CUSTOM_HEIGHT);

确保为 collectionView 设置委托

让我知道进展如何:)

更新

对于单元格,也添加这些方法:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
    return CGRectZero;


- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section 
    return 0;

至于sectionHeader,也许您需要检查那里的约束条件,例如分隔符。

【讨论】:

感谢卡特琳娜的帮助。不幸的是,内容保持其原始大小。你推荐的两种方法我都试过了。我将发布一张图片以更好地解释。 :) 是否调用了委托方法?您可以在此处添加NSLog 以打印collectionView 框架,以检查它是否正确 它们被调用并且返回值正确。 :// 我已经用一个新建议更新了我的答案。单元格的大小似乎正确,我认为问题在于项目之间的间距。对于标题,也许您可​​以再次检查约束,或者更改它的背景颜色以查看它具有的确切帧 太棒了!很高兴我们能弄清楚?【参考方案2】:

请务必使用以下所有内容进行精确造型:

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;

要更改单元格内容大小,请使用以下命令:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    return CGSizeMake((kScreenWidth/2-8), 44); // Use your own X and Y sizes

【讨论】:

感谢您的关注。但这不是我的答案。内容保持其原始大小。另外,我已经在实现单元格内容大小了。

以上是关于UICollectionView 内容未正确调整大小的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 具有自调整大小的单元格未正确计算 contentSize

在第一个实例上,内容未在 UICollectionViewCell 内调整大小

自动调整UICollectionView高度以调整其内容大小

UICollectionView ReloadData 未正确显示内容

Swift:集合视图未正确调整以更改大小

QQuickView 内容未正确调整大小