UICollectionView
のカスタムレイアウトを使用しています。私のセルは、固定幅と柔軟な高さを持つ必要があります。systemLayoutSizeFittingレイアウト制約を無視し、画像ビューの組み込みサイズを使用
セルは、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)
それはpreferredSizeががImageViewのinstrinsicサイズではなく、制約を尊重を使用して計算されていることが判明しました。だから、850x850の画像(そして160ポイントの幅を持つセル)では、私が予想しているよりもはるかに高い高さを得ています。
私はこの問題を、ハックのように感じるもので解決することができました。
私はlayoutAttributesから取得し、setNeedsLayout()とlayoutIfNeeded()を呼び出す固定値でこのメソッドを呼び出すと、イメージの幅の制約への参照を作成しました。しかし、私は実際にはレイアウトを強制的にやり直さなければならず、幅を自分自身で更新しなければならないというのは本当に好きではありません。
これはどのようにしてより良い方法で実行できますか?
ありがとうございました。
は、あなたが、私はそれを修正する方法ですそれviewDidLayoutSubviews – YaBoiSandeep