Как заставить UICollectionViewCell соответствовать своим подвидам (используя Auto Layout)

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

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

Я использую UICollectionViewFlowLayout и пробовал:

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

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


person fabian789    schedule 30.08.2013    source источник
comment
Тот же принцип, что и stackoverflow.com /questions/18477220/ , к сожалению, вам нужно указать размер заранее.   -  person jrturton    schedule 30.08.2013
comment
У вышеприведенного автора есть комментарий об использовании свободной ячейки - той, которую вы создаете, а затем храните, чтобы заполнить, а затем получить размер. Вы должны иметь возможность использовать [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] — сейчас у меня проблемы, но один из них должен работать.   -  person David H    schedule 07.10.2013


Ответы (3)


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

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

и сделать приоритет ограничения (низкий = 250)

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

person Akshar Darji    schedule 19.09.2015

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

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

}

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

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

person MoMo    schedule 23.07.2015

Попробуйте коллекцияView:layout:sizeForItemAtIndexPath:

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