it-swarm.com.ru

Изменить размер ячеек UICollectionView после того, как их данные были установлены

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

-(CGSize)collectionView:(UICollectionView *)collectionView
                 layout:(UICollectionViewLayout*)collectionViewLayout
 sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

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

Есть ли способ компоновки коллекции и размера ячеек ПОСЛЕ того, как они были отрисованы, и я знаю фактический размер ячейки?

48
Shocks

Я думаю, вы ищете метод invalidateLayout, который вы можете вызвать .collectionViewLayout свойство вашего UICollectionView. Этот метод восстанавливает ваш макет, что в вашем случае означает также вызов -collectionView: layout: sizeForItemAtIndexPath:, это правильное место для отображения желаемого размера элемента. Jirune указывает правильное направление, как рассчитать их.

Пример использования invalidateLayout можно найти здесь . Также обратитесь к документации UICollectionViewLayout по этому методу:

Делает недействительным текущий макет и вызывает обновление макета.

Обсуждение:

Вы можете вызвать этот метод в любое время, чтобы обновить информацию макета. Этот метод делает недействительным макет самого представления коллекции и сразу же возвращает его. Таким образом, вы можете вызывать этот метод несколько раз из одного и того же блока кода, не вызывая многократных обновлений макета. Фактическое обновление макета происходит во время следующего цикла обновления макета представления.

Edit:

Для представления коллекции раскадровок, которое содержит ограничения автоматического макета, необходимо переопределить viewDidLayoutSubviews метод UIViewController и ​​вызвать invalidateLayout макет представления коллекции в этом методе.

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [yourCollectionView.collectionViewLayout invalidateLayout];
}
72
Ignatius Tremor

подкласс UICollectionViewCell и переопределить layoutSubviews, как это

тем самым вы будете привязывать переднюю и конечную границу ячейки к collectionView

override func layoutSubviews() {
        super.layoutSubviews()

        self.frame = CGRectMake(0, self.frame.Origin.y, self.superview!.frame.size.width, self.frame.size.height)
    }
5
János

Эй, в самом методе delegate, приведенном выше, вы можете вычислить размер UILabel, используя хитрый способ, приведенный ниже, и вернуть UICollectionViewCellsize на основе этого вычисления.

    // 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];
4
Jirune
- (void)viewDidLoad {
    self.collectionView.prefetchingEnabled = NO;
}

В iOS 10 prefetchingEnabled по умолчанию является YES. Когда YES, представление коллекции запрашивает ячейки заранее, когда они будут отображаться. Это приводит к сбою в iOS 10

2
Sakshi Jain