I ran into this error UICollectionViewmode the horizontal scroll ( iOS 8, iOS 7only the ones I tested).
My question
I would like to have your views on this error and on how I could gracefully solve it.
Customization
UICollectionViewFlowLayout * layout ;
layout = [[UICollectionViewFlowLayout alloc] init] ;
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal ;
layout.minimumInteritemSpacing = 5 ;
layout.minimumLineSpacing = 100 ;
Error
Itβs hard to explain, but I will do my best. The error occurs when the cells in the UICollectionView do not have the same size.
when all cells are the same size, it looks like this:

but as soon as one of the cells has a different size than the others, it looks like this:

So it seems that it is changing the values ββof minimumInteritemSpacingand minimumLineSpacing.
Link to the minimum non-working example
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];
}
#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