我目前正致力于自动调整iOS8
中新增的细胞。
根据WWDC 2014视频“表和集合视图中的新功能”,自动调整单元格所需的全部内容是在estimatedSize
上为UICollectionViewFlowLayout
设置UICollectionView
初始化,并覆盖sizeThatFits:
。{/ p>中的UICollectionViewCell
方法
初始化:
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setEstimatedItemSize:CGSizeMake(146.0f, 156.0f)];
_collectionView = [[UICollectionView alloc] initWithFrame:[_containerView bounds] collectionViewLayout:flowLayout];
我的单元格中的 sizeThatFits
方法,其中_userLabel是底部的标签,标记实际高度。
- (CGSize)sizeThatFits:(CGSize)size
{
CGSize actualSize = CGSizeMake([[self contentView] bounds].size.width, [_userLabel frame].origin.x + [_userLabel bounds].size.height);
return actualSize;
}
事实证明,实际尺寸的高度大于我估计的尺寸,这应该没问题,并且细胞实际上在高度上得到了适当的调整。
现在使用iPhone6和6+,宽度也可能不同。我希望细胞正确地跨越屏幕的宽度。因此我在UICollectionViewFlowLayout上实现了三个委托方法;我的第一个直觉是根据屏幕宽度,部分插图和项目间距来计算我希望单元格具有的宽度。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
UIEdgeInsets sectionInsets = [self collectionView:collectionView layout:collectionViewLayout insetForSectionAtIndex:[indexPath section]];
CGFloat interItemSpacing = [(UICollectionViewFlowLayout *) collectionViewLayout minimumInteritemSpacing];
CGFloat cellWidth = ([_collectionView bounds].size.width - sectionInsets.left - sectionInsets.right - interItemSpacing) / 2;
CGSize collectionViewCellSize = CGSizeMake(cellWidth, 156.0f);
return collectionViewCellSize;
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
return 12.0f;
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake(10.0f, 10.0f, 10.0f, 10.0f);
}
无论如何都有效。 collectionView不会尊重顶部插图,当滚动collectionView时,切换出另一个标签然后再返回,单元格似乎已经消失。
显然我做错了什么,但我似乎无法弄清楚在哪里。有人知道吗?