Как сделать UICollectionViewCell подходящим для его подзонов (с помощью Auto Layout)

Как я могу изменить размер UICollectionViewCell в зависимости от размера его подзонов, используя Auto Layout?

Мой UICollectionViewCell каждый из них имеет только один вид в своем contentView. Это пользовательский подкласс UIView, который автоматически изменяет размеры, чтобы соответствовать всем его представлениям, используя Auto Layout. Он также правильно реализует -intrinsicContentSize. Однако UICollectionView, а точнее его расположение, похоже, не заботятся об этом.

Я использую UICollectionViewFlowLayout и пытаюсь:

  • Оставляем itemSize по умолчанию. Это дает мне ячейки размером 50 х 50.
  • Реализация метода делегата -collectionView:layout:sizeForItemAtIndexPath:. Однако, когда этот метод вызывается, ячейки (очевидно) еще не появились на экране и не были обновлены системой автоматического макета.

Есть ли способ изменить размер моих ячеек на основе их подзонов с использованием стандартных классов Apple? Или мне нужно реализовать свой собственный подкласс UICollectionViewLayout или что-то еще?

Ответ 1

Вы пробовали это:

[self.view layoutIfNeeded];
[UIView animateWithDuration:0.5 animations:^{
     constraintConstantForWidth.constant = subviews.size.width;
     constraintConstantForHeight.constant = subviews.size.height;
     [self.view layoutIfNeeded];
}];

и установите приоритет ограничения (low = 250)

Я думаю, что эту проблему мы можем обработать с помощью замены константы ограничения.

Ответ 2

Я использовал

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 0) {
        UIButton *button = (UIButton *)[cell viewWithTag:2];
        CGRect frame = cell.frame;
        frame.size.width = button.frame.size.width;
        cell.frame = frame;
    }

}

и смог изменить размер моей ячейки на основе ширины кнопки subview в небольшом тестовом приложении.

Удостоверьтесь, что теги в ваших представлениях больше 0, потому что если вы используете 0, он просто возвращает содержимое contentView. Кроме этого, это должно заставить вас туда

Ответ 3

Попробуйте collectionView: layout: sizeForItemAtIndexPath:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     return self.view.frame.size;
}