В iOS 8 UICollectionViewFlowLayout
поддерживает автоматическое изменение размеров ячеек на основе их собственного размера содержимого. Это изменяет размеры ячеек как по ширине, так и по высоте в зависимости от их содержимого.
Можно ли указать фиксированное значение для ширины (или высоты) всех ячеек и изменить размеры других размеров?
Для простого примера рассмотрим многострочную метку в ячейке с ограничениями, позиционирующими ее по сторонам ячейки. Многострочная метка может быть изменена различными способами для размещения текста. Ячейка должна заполнить ширину представления коллекции и соответствующим образом отрегулировать ее высоту. Вместо этого ячейки имеют случайный размер и даже приводят к сбою, когда размер ячейки больше, чем размер прокручиваемого вида коллекции.
В iOS 8 вводится метод systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:
. Для каждой ячейки в представлении коллекции макет вызывает этот метод в ячейке, передавая примерный размер. Мне было бы лучше переопределить этот метод на ячейке, передать размер, который задан, и установить горизонтальное ограничение и низкий приоритет для вертикального ограничения. Таким образом, горизонтальный размер фиксируется на значение, установленное в макете, и размер по вертикали может быть гибким.
Что-то вроде этого:
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
return attributes;
}
Однако размеры, приведенные в этом методе, совершенно странны. Документация по этому методу очень неясна для меня и упоминает использование констант UILayoutFittingCompressedSize
UILayoutFittingExpandedSize
, которые просто представляют нулевой размер и довольно большой.
Является ли параметр size
этого метода просто способом передачи двух констант? Невозможно ли достичь такого поведения, которое я ожидаю от получения соответствующей высоты для заданного размера?
Альтернативные решения
1) Добавление ограничений, которые будут указывать конкретную ширину ячейки, обеспечивает правильную компоновку. Это плохое решение, потому что это ограничение должно быть установлено на размер представления коллекции ячеек, к которому у него нет безопасной ссылки. Значение для этого ограничения может быть передано, когда ячейка настроена, но это также кажется совершенно противоречивым. Это также неудобно, потому что добавление ограничений непосредственно в ячейку или просмотр содержимого вызывает много проблем.
2) Используйте представление таблицы. Представления таблиц работают таким образом из коробки, поскольку ячейки имеют фиксированную ширину, но это не будет учитывать другие ситуации, такие как макет iPad с ячейками фиксированной ширины в нескольких столбцах.