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 в коде

Другие вопросы по тегам