UICollectionView内容未正确调整大小

时间:2015-04-23 11:01:00

标签: ios objective-c autolayout uicollectionview autoresizingmask

我在静态表视图单元格中使用集合视图,并且我使用autolayout来定义集合视图的框架。另外,我使用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列。

2 个答案:

答案 0 :(得分:3)

根据您发布的代码,您只需设置标题的大小,但我想您也有类似的内容

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

重要的部分是你在哪种方法中配置它,因为如果你在viewDidLoad中执行它,那么视图也没有正确布局,所以宽度只是故事板中设置的宽度,无论你在哪个设备上运行你的app

解决方案是将上面的代码放在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,您可能需要检查您在那里的约束,例如分隔符。

答案 1 :(得分:0)

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

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