2017-06-28 16 views
4

UICollectionViewのカスタムレイアウトを使用しています。私のセルは、固定幅と柔軟な高さを持つ必要があります。systemLayoutSizeFittingレイアウト制約を無視し、画像ビューの組み込みサイズを使用

セルは、UImageViewUIStackViewで構成されています。 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()を呼び出す固定値でこのメソッドを呼び出すと、イメージの幅の制約への参照を作成しました。しかし、私は実際にはレイアウトを強制的にやり直さなければならず、幅を自分自身で更新しなければならないというのは本当に好きではありません。

これはどのようにしてより良い方法で実行できますか?

ありがとうございました。

+0

は、あなたが、私はそれを修正する方法ですそれviewDidLayoutSubviews – YaBoiSandeep

答えて

1

アスペクト比の制約はありますか? アスペクト比の制約がある場合、systemLayoutSizeFittingが正しく機能しません。

まず、画像上の代わりにアスペクト比の高さ制約を設定しようと、それが動作するかどうか、高さ制約定数を設定= image.widthコードで* 1.33

+0

を上書きしようとすることはできますが、私は自分自身でそれをやらなければならないと嫌いですし、layoutIfNeeded()を呼び出す必要があります。私もパフォーマンスの問題があり、避けたいと思います。 –

+0

systemLayoutSizeFittingがアスペクト比で正しく動作しない場合の詳細を教えてください。あなたは参考文献を持っていますか? –

+0

@NunoGonçalves実際、頻繁に問題があります。 heightLengthを設定しない場合、systemLayoutSizeはintrinsicContentSizeを使用して高さを計算します。この問題のもう1つの解決策は次のとおりです。https://stackoverflow.com/questions/25664716/uiview-aspect-ratio-confuses-systemlayoutsizefittingsize – iamirzhan

関連する問題