Изменение размеров ячеек UICollectionView после их установки
Мои ячейки UICollectionView
содержат UILabels
с многострочным текстом. Я не знаю height
UICollectionViewCells
, пока текст не будет установлен на UILabel
.
-(CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
Был ли начальный метод, на который я смотрел, имел размер UICollectionViewCells
, однако это называется ПЕРЕД тем, как ячейки создаются из UIStoryboard
. Есть ли способ компоновки коллекции и размера ячеек ПОСЛЕ их рендеринга, и я знаю фактический размер ячейки?
Ответы
Ответ 1
Я думаю, что вы ищете метод invalidateLayout
, который вы можете вызвать в свойстве .collectionViewLayout
вашего UICollectionView. Этот метод регенерирует ваш макет, который в вашем случае означает также вызов -collectionView: layout: sizeForItemAtIndexPath:
, который является правильным местом для отражения вашего желаемого размера. Jirune указывает правильное направление на то, как рассчитать их.
Пример использования invalidateLayout
можно найти здесь. Также обратитесь к документации UICollectionViewLayout по этому методу:
Отменяет текущий макет и запускает обновление макета.
Обсуждение:
Вы можете вызвать этот метод в любое время, чтобы обновить информацию о макете. Этот метод делает недействительным макет самого представления коллекции и сразу возвращается. Таким образом, вы можете вызывать этот метод несколько раз из одного и того же блока кода без запуска нескольких обновлений макета. Фактическое обновление макета происходит во время следующего цикла обновления макета представления.
Изменить:
Для просмотра коллекции раскадровки, которая содержит ограничения автоматической компоновки, вам необходимо переопределить метод viewDidLayoutSubviews
UIViewController
и вызвать invalidateLayout
layout view в этом методе.
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[yourCollectionView.collectionViewLayout invalidateLayout];
}
Ответ 2
Эй, в приведенном выше методе delegate
, вы можете вычислить размер UILabel
с помощью сложного метода и вернуть UICollectionViewCell
size
на основе этого расчета.
// Calculate the expected size based on the font and
// linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(9999,9999);
CGSize expectedLabelSize =
[[self.dataSource objectAtIndex:indexPath.item]
sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f]
constrainedToSize:maximumLabelSize
lineBreakMode:NSLineBreakByWordWrapping];
Ответ 3
подкласс UICollectionViewCell и переопределить layoutSubviews
как этот
при этом вы будете привязывать ведущую и конечную границу ячеек к коллекцииView
override func layoutSubviews() {
super.layoutSubviews()
self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height)
}
Ответ 4
- (void)viewDidLoad {
self.collectionView.prefetchingEnabled = NO;
}
В iOS 10, prefetchingEnabled
по умолчанию YES
. Когда YES
, представление коллекции запрашивает ячейки до того, когда они будут отображаться. Это приводит к сбою в iOS 10