( EDIT: он работает нормально, начиная с 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;
}