UICollectionViewFlowLayout оцененоИзменение прокрутки строки?

( 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;
}

Ответ 1

Из Apple Document,

В частности, ячейки, которые не находятся на экране, считаются оцененной высотой.

Это мое предположение.

Когда расчетная высота меньше фактической высоты ячейки, предсказание размера содержимого коллекций меньше фактического размера содержимого.

Поэтому он отображает только 32 отображения из 40 ячеек.

В моем проекте все celsl отображаются при использовании большого оценочного размера.

Ответ 2

Из документации:

Значением по умолчанию этого свойства является CGSizeZero. Установка его на любой другое значение вызывает просмотр коллекции для каждой ячейки для ее фактический размер с использованием ячеек preferredLayoutAttributesFittingAttributes:. Если все ваши ячейки имеют одинаковую высоту, используйте свойство itemSize, а не это свойство, чтобы указать размер ячейки.

Кажется, вы не используете этот метод preferredLayoutAttributesFittingAttributes: в своем проекте?, вы пытались его реализовать?

С другой стороны, это решение выглядит хорошо: Указание одного измерения ячеек в UICollectionView с использованием автоматической компоновки