UICollectionViewFlowLayout的严重错误:水平滚动模式下的minimumInteritemSpacing和minimumLineSpacing

我在水平滚动模式iOS 8iOS 7 ,我testing过的唯一一个)中面对以下UICollectionView错误。

我的问题

我想就这个错误以及如何优雅地解决这个问题发表看法。

设置

 UICollectionViewFlowLayout * layout ; layout = [[UICollectionViewFlowLayout alloc] init] ; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal ; layout.minimumInteritemSpacing = 5 ; layout.minimumLineSpacing = 100 ; 

错误

这是很难解释,但我会尽我所能。 当UICollectionView中的单元格不具有相同的大小时,会发生该错误。

  • 当所有的细胞有相同的大小,看起来像这样 在这里输入图像说明

  • 但只要其中一个单元的大小与其他单元的大小不同,就像这样 在这里输入图像说明

所以,它似乎交换了minimumInteritemSpacingminimumLineSpacing

链接到一个最小的非工作示例

https://github.com/colasjojo/TEST_COLLECTION_VIEW_BUG

更多的代码

 #import "ViewController.h" #import "MyCell.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *viewForCollectionView; @property (nonatomic, assign, readwrite) NSInteger selectedIndex ; @end @implementation ViewController // // /**************************************/ #pragma mark - Init /**************************************/ - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder] ; if (self) { [self configure] ; } return self ; } - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil] ; if (self) { [self configure] ; } return self ; } - (void)configure { _selectedIndex = -1 ; } // // /**************************************/ #pragma mark - Life cycle /**************************************/ - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout * layout ; layout = [[UICollectionViewFlowLayout alloc] init] ; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal ; layout.minimumInteritemSpacing = 5 ; layout.minimumLineSpacing = 100 ; UICollectionView * collectionView ; CGRect frame ; frame.size = self.viewForCollectionView.frame.size ; collectionView = [[UICollectionView alloc] initWithFrame:frame collectionViewLayout:layout] ; collectionView.dataSource = self ; collectionView.delegate = self ; collectionView.backgroundColor = [UIColor clearColor] ; [collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([MyCell class]) bundle:nil] forCellWithReuseIdentifier:@"MyCell"] ; [self.viewForCollectionView addSubview:collectionView] ; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } // // /**************************************/ #pragma mark - Datasourcing /**************************************/ - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 100 ; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MyCell * cell ; cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath] ; cell.label.text = [@([indexPath indexAtPosition:1]) stringValue] ; ; return cell ; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { if ([indexPath indexAtPosition:1] == self.selectedIndex) { return CGSizeMake(200, 200) ; } else { return CGSizeMake(110, 110) ; } } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { NSMutableArray * indexes = [NSMutableArray new] ; if (self.selectedIndex >= 0) { [indexes addObject:[NSIndexPath indexPathForItem:self.selectedIndex inSection:0]] ; } if (self.selectedIndex != [indexPath indexAtPosition:1]) { [indexes addObject:indexPath] ; self.selectedIndex = [indexPath indexAtPosition:1] ; } else { self.selectedIndex = -1 ; } [collectionView reloadItemsAtIndexPaths:indexes] ; } @end