Как сделать 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;
}