Подтвердить что ты не робот

Изменение размеров ячеек UICollectionView после их установки

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

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

Был ли начальный метод, на который я смотрел, имел размер UICollectionViewCells, однако это называется ПЕРЕД тем, как ячейки создаются из UIStoryboard. Есть ли способ компоновки коллекции и размера ячеек ПОСЛЕ их рендеринга, и я знаю фактический размер ячейки?

4b9b3361

Ответ 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