Erro grave para UICollectionViewFlowLayout: minimumInteritemSpacing e minimumLineSpacing no modo de rolagem horizontal
Estou enfrentando o seguinte bug comUICollectionView
nomodo de rolagem horizontal (iOS 8
, iOS 7
, os únicos que eu testei).
Gostaria de ter sua opinião sobre esse bug e sobre como eu poderia resolvê-lo com elegância.
A configuraçãoUICollectionViewFlowLayout * layout ;
layout = [[UICollectionViewFlowLayout alloc] init] ;
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal ;
layout.minimumInteritemSpacing = 5 ;
layout.minimumLineSpacing = 100 ;
O insetoÉ difícil de explicar, mas farei o meu melhor. O erro ocorre quando as células no UICollectionView não têm os mesmos tamanhos.
quando todas as células têm o mesmo tamanho, fica assim
mas assim que uma das células tem um tamanho diferente das outras, fica assim
Então, parece que ele intercambia ominimumInteritemSpacing
eminimumLineSpacing
.
https://github.com/colasjojo/TEST_COLLECTION_VIEW_BUG
Mais código#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