(编辑:从 iOS 9 开始,它似乎工作正常。我没有进行大量测试,但示例有效。这证实了iOS中存在的错误8)
我花了很多时间测试UICollectionView的Flow Layout自我调整大小的行为。经过很多挫折后,问题被缩小到这样一个事实,即只要将estimatedItemSize
设置为非零大小,滚动就不再正常工作。
在我的示例中,它不显示40个项目,而只显示32.
我复制粘贴下面的代码。我从Swift版本开始测试了很多东西。
基本上它无法计算和/或正确更新布局collectionViewContentSize()
以下是完整的演示http://git.io/AIrHNA
任何人都能指出我正确的方向吗?
谢谢
@implementation ViewControllerObjcC
static NSString * const reuseIdentifier = @"Cell";
-(UICollectionViewFlowLayout*)flowLayout{
return (UICollectionViewFlowLayout*)self.collectionViewLayout;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
CGSize estimatedSize = CGSizeMake(self.view.frame.size.width, 25.0);
BOOL testEstimatedItemSize = true;
if (testEstimatedItemSize) {
[self flowLayout].estimatedItemSize = estimatedSize;
}else{
[self flowLayout].itemSize = estimatedSize;
}
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 40;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
[cell.contentView addSubview:label];
label.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
label.backgroundColor = [UIColor redColor];
return cell;
}
答案 0 :(得分:1)
具体而言,不在屏幕上的单元格被假定为估计高度。
这是我的猜测。
当估计的高度小于实际的单元格高度时,集合视图的内容大小预测小于实际的内容大小。
因此,它只显示总共40个单元格中的32个。
在我的项目中,当使用较大的估计尺寸时,会显示所有celsl。
答案 1 :(得分:0)
来自文档:
此属性的默认值为
CGSizeZero
。将其设置为任何 其他值导致集合视图查询每个单元格 使用单元格的实际大小preferredLayoutAttributesFittingAttributes:
方法。如果你所有的 单元格高度相同,使用itemSize
属性,而不是。{ 此属性,用于指定单元格大小。
您的项目中似乎没有使用此preferredLayoutAttributesFittingAttributes:
方法?是否尝试过实施?
另一方面,这个解决方案看起来不错: Specifying one Dimension of Cells in UICollectionView using Auto Layout
答案 2 :(得分:0)
我有同样的问题。在我的情况下,项目之间的间隔是32。我的代码是这样的:
collectionViewLayout.minimumInteritemSpacing = 0
collectionViewLayout.minimumLineSpacing = 32
collectionViewLayout.scrollDirection = .horizontal
collectionViewLayout.itemSize = UICollectionViewFlowLayout.automaticSize
collectionViewLayout.estimatedItemSize = CGSize(width: 100, height: 32)
我将minimumInteritemSpacing
更改为32,与minimumLineSpacing
相同,以解决此问题。
collectionViewLayout.minimumInteritemSpacing = 32