動的テーブルセルと自動レイアウトに関連する記事を3日間調べましたが、今のところ機能していません。
以下は、私が欲しかったテーブルセルです。ここでの主な問題は、投稿テキストとUIImageのUILabelです。
UI要素の階層は次のとおりです。
- Content View
+ ...
+ UILabel for text - dynamic height
+ UIView - image view container
* UIImageView
* UIImageView
* ....
ラベルに改行モードの折り返しテキストと行セットがあります0に。 ラベルとコンテナビューには、上部、下部、先頭および末尾の制約があります。 ImageViewsは実行時に追加され、上部、先頭、末尾、下部、および高さの制約があります。 最初の画像ビューにはコンテナビューに対する上部の制約があり、最後の画像ビューにはコンテナビューに対する下部の制約があり、その他の画像ビューには上部の画像ビューに対する上部の制約があります。
テーブルが最初に読み込まれたとき(セルの画像数が異なる)、見た目は良くなりますが、上下にスクロールすると、いくつかのセルで制約が壊れ、セル内で画像が重なります。
これはエラー出力です:
Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don"t want.
Try this:
(1) look at each constraint and try to figure out which you don"t expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
"<NSLayoutConstraint:0x17428aaf0 V:|-(0)-[UIImageView:0x14be77ed0] (active, names: "|":UIView:0x14be75b20 )>",
"<NSLayoutConstraint:0x17428a6e0 UIImageView:0x14be77ed0.height == 160 (active)>",
"<NSLayoutConstraint:0x17428acd0 UIImageView:0x14be77ed0.bottom == UIView:0x14be75b20.bottom (active)>",
"<NSLayoutConstraint:0x174289650 V:|-(0)-[UIImageView:0x14be43ce0] (active, names: "|":UIView:0x14be75b20 )>",
"<NSLayoutConstraint:0x17428bb80 UIImageView:0x14be43ce0.height == 160 (active)>",
"<NSLayoutConstraint:0x17428be50 V:[UIImageView:0x14be43ce0]-(10)-[UIImageView:0x14be74b10] (active)>",
"<NSLayoutConstraint:0x17428bfe0 UIImageView:0x14be74b10.height == 160 (active)>",
"<NSLayoutConstraint:0x17428c080 UIImageView:0x14be74b10.bottom == UIView:0x14be75b20.bottom (active)>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x17428be50 V:[UIImageView:0x14be43ce0]-(10)-[UIImageView:0x14be74b10] (active)>
この問題で私を助けてください。ありがとうございました。
回答:
回答№1は0画像に高さを与えないことをお勧めします。代わりに、垂直スタックビューをコンテナビューに追加し、そこにすべての画像を追加します。コンテンツモードがアスペクトに合わせて設定されていることを確認し、stackviewが残りを処理する必要があります。スタックビューをラベルの下部とセルの下部に制限することを忘れないでください。そうすれば、どのくらいのスペースがあるかがわかります。それ自体で画像を処理します。
回答№2の場合は1
セルがデキューされるときにスタックビューに古いイメージが含まれていないことを確認するには、それをクリーンアップする必要があります prepareForReuse()
:
override func prepareForReuse() {
super.prepareForReuse()
stack.arrangedSubviews.forEach {
stack.removeArrangedSubview($0)
$0.removeFromSuperview()
}
}
回答№3の場合は0
ImageViewsは実行時に追加され、上部、先頭、末尾、下部、および高さの制約があります。
これはエラーメッセージです。削除する どちらか 高さまたは選択した制約の1つ 下または上 制約。 4つの側面すべてに制約を設定して、それに高さの制約を追加することはできません。
サイドノート:
幅についても同じことが言えます。幅の制約を設定した場合、両方のサイドを同時にリーディング/トレーリング制約することはできません。
編集:
また、 UIStackView
コメントセクションで提案されているように。