systemLayoutSizeFitting игнорирует ограничения макета и использует внутренний размер представления изображения
Я использую пользовательский макет для UICollectionView
, Моя камера должна иметь фиксированную ширину и гибкую высоту.
Ячейка состоит из UImageView
и UIStackView
, UIImageView
Вот ограничения:
image.top = cell.top
image.width = cell.width
image.height = image.width * 1.33
image.centerX = cell.centerX
image.bottom = stackView.top
Представление стека аналогично и действительно привязано к нижней части ячейки.
Когда система звонит preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
Я выполняю некоторые вычисления, чтобы получить высоту ячейки.
let preferredAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)
let size = CGSize(width: layoutAttributes.frame.width,
height: UILayoutFittingCompressedSize.height)
let preferredSize = systemLayoutSizeFitting(size,
withHorizontalFittingPriority: .defaultHigh,
verticalFittingPriority: .fittingSizeLevel)
Оказывается, что предпочитаемый размер вычисляется с использованием собственного размера imageView, а не с учетом ограничений. Так что для изображения с 850x850 (и ячейкой с 160 точками ширины) я получаю гораздо большую высоту, чем я ожидаю, и, следовательно, ячейку с огромным пространством снизу.
Мне удалось решить эту проблему с чем-то, что я чувствую, как взломать.
Я создал ссылку на ограничение ширины изображения, обновил его, когда я вызываю этот метод с фиксированным значением, которое я получаю из layoutAttributes, и вызываю setNeedsLayout() и layoutIfNeeded(), и это работает. Но мне действительно не нравится, что я вынужден снова делать макет и обновлять ширину самостоятельно, не говоря уже о том, что я теряю производительность.
Как это можно сделать лучше?
Большое спасибо.
1 ответ
У вас есть ограничение соотношения сторон? systemLayoutSizeFitting не работает должным образом, когда есть ограничение соотношения сторон.
Во-первых, попробуйте установить ограничение высоты вместо соотношения сторон на изображении и, если оно работает, установите константу ограничения высоты = image.width * 1,33 в коде