Подвижные ячейки UICollectionView не изменяются

В CollectionView некоторые ячейки должны иметь дополнительный subview или layer. CollectionView может сказать, что он изменяет размеры его ячеек, поэтому весь контент должен соответствующим образом изменяться.

В настоящее время ячейка инициализируется из ниба, содержащего ячейку с изображением; Ячейка ячейки связана с пользовательским подклассом UICollectionViewCell, который только инициализирует. Проверяются подпрограммы Autoresize.

Сообщается, что CollectionView изменяет размер ячейки на значение, полученное и возвращенное в "sizeForItemAtIndexPath:". Я подклассифицировал FlowLayout, но он определяет только ScrollDirection и Insets.

Все работает нормально. Проблема: Как добавить subview/layer в ячейку, чтобы он также правильно изменял размер? Я попытался добавить subviews и слои с translatesAutoresizingMaskIntoConstraints, но они не меняют размер автоматически. Также попытался использовать фрейм/представление кода вместо nib.

Лучшее, что я получил сейчас, - это подуровень cell.contentView.layer, который я добавляю в cellForItemAtIndexPath:; который "вручную" изменяется, сохраняя ячейку frame.size от sizeForItemAtIndexPath:, которая не только уродлива, но и заканчивается подслоем, имеющим различные размеры для разных ячеек.

Любая помощь оценивается!

Ответ 1

Решение заключалось в том, чтобы отключить AutoConstraints для ячейки xib и активировать гибкие стрелки ширины/высоты в AutoResize для изображений.

Ответ 2

Я столкнулся с тем же вопросом только сейчас.

При использовании метода UICollectionViewFlowLayoutDelegate для установки размера ячейки в зависимости от устройства и ориентации устройства размер будет правильно рассчитан, но subviews не будут изменять размер, чтобы заполнить ячейку нового размера. Эффектом была большая пустая ячейка с небольшими областями, которые не заполняют границы ячейки/остаются размером, равным их текущему значению в файле xib.

Я решил это, выполнив следующее в awakeFromNib:

- (void)awakeFromNib
{
    [super awakeFromNib];

    self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.contentView.translatesAutoresizingMaskIntoConstraints = YES;
}

До этого маска contentView была nil.

Ответ 3

*override func awakeFromNib() {
    super.awakeFromNib()

    self.contentView.autoresizingMask.insert(.FlexibleHeight)
    self.contentView.autoresizingMask.insert(.FlexibleWidth)
}

Это сработало для меня. Этот код находится внутри вашего подкласса файла UICollectionViewCell.swift(где находится ваш код, содержащий пользовательскую ячейку)

Быстрое решение *

Ответ 4

В качестве альтернативы включению AutoResizingMask для пользовательских UICollectionViewLayouts, которые имеют переменную высоту, например, когда вы устанавливаете некоторые ограничения вручную и нуждаетесь в переводахAutoresizingMaskIntoConstraints, чтобы оставаться НЕТ, вы можете добавить следующее в layoutSubviews в ячейке:

self.contentView.frame = self.bounds;

Это сработало, чтобы исправить все мои собственные макеты просмотра коллекций, у которых были проблемы с Xcode 6.

Ответ 5

В другом проекте без xibs я подклассифицировал UICollectionViewCell и сделал это для того же эффекта:

#import "CVcell.h"

@implementation CVcell

@synthesize cellImage;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        CGFloat cellSize = self.contentView.bounds.size.width;
        cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, cellSize, cellSize)];
        [cellImage setClipsToBounds:YES];

        cellImage.translatesAutoresizingMaskIntoConstraints = NO;
        cellImage.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [self.contentView addSubview:cellImage];

    }
    return self;
}

@end

Ответ 6

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

В случае UICollectionViewCell я устанавливаю изображение как ячейку frame +       self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Но когда у меня были разные размеры ячеек в коллекции, это перепутало вещи, и изображение иногда занимало размер другой ячейки.

Итак, я обратился к работе с границами ячеек и - вы, которые были наработаны нормально.

Так что, может быть, попробуйте?

Ответ 7

Простое решение автоматической компоновки - установить ограничения на представление контейнера.

Таким образом, если у нас есть представление изображения с родительским представлением, мы в основном хотим сказать subview (вид изображения) поддерживать верхнее, конечное, нижнее и верхнее расстояние пробега 0 до представления контейнера.

Auto layout constraints to resize with parent view

Ответ 8

@Alfie Hanssen solution (здесь) не работает должным образом для меня, в соответствии с этой статьи:

Размер представления ячейки в XIB составляет 50 x 50 точек, что является размером по умолчанию для ячеек представления коллекции, как установлено в макете потока. Даже если его немного сложно работать с ячейкой, такой небольшой в Interface Builder, лучше не изменять размер по умолчанию. Проблема заключается в том, что Auto Layout считает размер установленного вручную как фиксированный и генерирует ошибку NSAutoresizingMaskLayoutConstraint при попытке автоматически настроить высоту ячеек

Я проверил UICollectionViewCell, и я обнаружил, что существует представление между ячейкой и contentView, и это представление имеет внутренние ограничения ширины и высоты. Вместо AutoresizingMask я просто обновляюсь, как показано ниже, и, похоже, работает для меня.

override func layoutSubviews() {
    contentView.superview?.frame = bounds
    super.layoutSubviews()
}

Ответ 9

У меня была та же проблема. Переключение между двумя макетами не изменило размер изображений (UIImage) внутри моих ячеек. Мои ячейки, где строятся без xib. И я использовал два разных класса ячейки для каждого CollectionViewCustomLayout.

Я исправил это программно следующим образом:

    self.autoresizesSubviews = YES;

в моих подклассах UICollectionViewCell.

Но это только сработало для меня, добавив изображение как ячейку backgroundpicture следующим образом:

cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];

Ответ 10

Я добавляю subView и ограничение программно, для меня работает следующий код:

lazy var imageView: UIImageView = { [unowned self] in
    let imageView = UIImageView(frame: self.contentView.frame)
    imageView.contentMode = .scaleAspectFill
    imageView.clipsToBounds = true

    return imageView
}() 

func updateCellWith(image: UIImage) {

    contentView.subviews.forEach { $0.removeFromSuperview() }

    contentView.addSubview(imageView)
    imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true
    imageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true
    imageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true
    imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true

    self.imageView.autoresizingMask.insert(.flexibleHeight)
    self.imageView.autoresizingMask.insert(.flexibleWidth)

    imageView.image = image

}