Ответ 1
Решение заключалось в том, чтобы отключить AutoConstraints для ячейки xib и активировать гибкие стрелки ширины/высоты в AutoResize для изображений.
В CollectionView некоторые ячейки должны иметь дополнительный subview или layer. CollectionView может сказать, что он изменяет размеры его ячеек, поэтому весь контент должен соответствующим образом изменяться.
В настоящее время ячейка инициализируется из ниба, содержащего ячейку с изображением; Ячейка ячейки связана с пользовательским подклассом UICollectionViewCell, который только инициализирует. Проверяются подпрограммы Autoresize.
Сообщается, что CollectionView изменяет размер ячейки на значение, полученное и возвращенное в "sizeForItemAtIndexPath:". Я подклассифицировал FlowLayout, но он определяет только ScrollDirection и Insets.
Все работает нормально. Проблема: Как добавить subview/layer в ячейку, чтобы он также правильно изменял размер? Я попытался добавить subviews и слои с translatesAutoresizingMaskIntoConstraints, но они не меняют размер автоматически. Также попытался использовать фрейм/представление кода вместо nib.
Лучшее, что я получил сейчас, - это подуровень cell.contentView.layer, который я добавляю в cellForItemAtIndexPath:; который "вручную" изменяется, сохраняя ячейку frame.size от sizeForItemAtIndexPath:, которая не только уродлива, но и заканчивается подслоем, имеющим различные размеры для разных ячеек.
Любая помощь оценивается!
Решение заключалось в том, чтобы отключить AutoConstraints для ячейки xib и активировать гибкие стрелки ширины/высоты в AutoResize для изображений.
Я столкнулся с тем же вопросом только сейчас.
При использовании метода UICollectionViewFlowLayoutDelegate для установки размера ячейки в зависимости от устройства и ориентации устройства размер будет правильно рассчитан, но subviews не будут изменять размер, чтобы заполнить ячейку нового размера. Эффектом была большая пустая ячейка с небольшими областями, которые не заполняют границы ячейки/остаются размером, равным их текущему значению в файле xib.
Я решил это, выполнив следующее в awakeFromNib
:
- (void)awakeFromNib
{
[super awakeFromNib];
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.contentView.translatesAutoresizingMaskIntoConstraints = YES;
}
До этого маска contentView была nil
.
*override func awakeFromNib() {
super.awakeFromNib()
self.contentView.autoresizingMask.insert(.FlexibleHeight)
self.contentView.autoresizingMask.insert(.FlexibleWidth)
}
Это сработало для меня. Этот код находится внутри вашего подкласса файла UICollectionViewCell.swift(где находится ваш код, содержащий пользовательскую ячейку)
Быстрое решение *
В качестве альтернативы включению AutoResizingMask для пользовательских UICollectionViewLayouts, которые имеют переменную высоту, например, когда вы устанавливаете некоторые ограничения вручную и нуждаетесь в переводахAutoresizingMaskIntoConstraints, чтобы оставаться НЕТ, вы можете добавить следующее в layoutSubviews в ячейке:
self.contentView.frame = self.bounds;
Это сработало, чтобы исправить все мои собственные макеты просмотра коллекций, у которых были проблемы с Xcode 6.
В другом проекте без 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
Я всегда предпочитаю автозапуск, когда это возможно. Но иногда фреймы и рамки пользователя - это просто таймер, когда представление определяется простым только над ним.
В случае UICollectionViewCell я устанавливаю изображение как ячейку frame + self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Но когда у меня были разные размеры ячеек в коллекции, это перепутало вещи, и изображение иногда занимало размер другой ячейки.
Итак, я обратился к работе с границами ячеек и - вы, которые были наработаны нормально.
Так что, может быть, попробуйте?
Простое решение автоматической компоновки - установить ограничения на представление контейнера.
Таким образом, если у нас есть представление изображения с родительским представлением, мы в основном хотим сказать subview (вид изображения) поддерживать верхнее, конечное, нижнее и верхнее расстояние пробега 0 до представления контейнера.
@Alfie Hanssen solution (здесь) не работает должным образом для меня, в соответствии с этой статьи:
Размер представления ячейки в XIB составляет 50 x 50 точек, что является размером по умолчанию для ячеек представления коллекции, как установлено в макете потока. Даже если его немного сложно работать с ячейкой, такой небольшой в Interface Builder, лучше не изменять размер по умолчанию. Проблема заключается в том, что Auto Layout считает размер установленного вручную как фиксированный и генерирует ошибку NSAutoresizingMaskLayoutConstraint при попытке автоматически настроить высоту ячеек
Я проверил UICollectionViewCell, и я обнаружил, что существует представление между ячейкой и contentView, и это представление имеет внутренние ограничения ширины и высоты. Вместо AutoresizingMask я просто обновляюсь, как показано ниже, и, похоже, работает для меня.
override func layoutSubviews() {
contentView.superview?.frame = bounds
super.layoutSubviews()
}
У меня была та же проблема. Переключение между двумя макетами не изменило размер изображений (UIImage) внутри моих ячеек. Мои ячейки, где строятся без xib. И я использовал два разных класса ячейки для каждого CollectionViewCustomLayout.
Я исправил это программно следующим образом:
self.autoresizesSubviews = YES;
в моих подклассах UICollectionViewCell.
Но это только сработало для меня, добавив изображение как ячейку backgroundpicture следующим образом:
cell.backgroundView[[UIImageView alloc] initWithImage: SumDummyImage ];
Я добавляю 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
}