Autolayoutまたは制約を使用して複数行のテキストLabelをレイアウトし、高度に不正確な(文字の切り捨て)解決策
1171 ワード
問題の説明
xibまたはstoryboard(純粋なコードもあるかもしれません)でコンストレイントまたはautolayoutレイアウトを使用した後、UILabelが複数行の文字をロードしたときの高さ計算が不正確で、文字が切断され、表示が不完全になります.
解決策
labelを設定します.preferredMaxLayoutWidthプロパティをlabelの実際の幅に等しくすると問題が解決します
ここでcellを呼び出すことに注意してください.contentViewのlayoutIfNeeded法は理論的にこの方法によって正確なcellを得ることができる.label.frame.widthですが、実測時にこの方法を使わなくてもいいです
特別ヒント
本論文の方法は理論的根拠がなく,実際の操作のみで確認可能である.
理論的にはUITableViewCellサブクラスでlayoutSubviewsを再ロードする方法がより実行可能であるが,実際のテストは直ちに有効にならず,cellの1回目の表示時に遮断される問題があり,2回目以降は正常に表示される可能性がある.
実際に実行可能な方法では、cellはまだビューにロードされておらず、label幅は計算できず、システムがどのように正しいサイズを得たのか分からない.デバッグ出力labelの幅も確かにランダムですが、表示結果は正しい++
xibまたはstoryboard(純粋なコードもあるかもしれません)でコンストレイントまたはautolayoutレイアウトを使用した後、UILabelが複数行の文字をロードしたときの高さ計算が不正確で、文字が切断され、表示が不完全になります.
解決策
labelを設定します.preferredMaxLayoutWidthプロパティをlabelの実際の幅に等しくすると問題が解決します
// UITableViewCell ,
override func layoutSubviews() {
super.layoutSubviews()
cell.contentView.layoutIfNeeded()
cell.label.preferredMaxLayoutWidth = cell.label.frame.width
}
// UITableView ,
override func tableView(_ tableView: UITableView, cellForRowAt indexPaht: IndexPath) -> UITableViewCell {
let cell = YourTableViewCell()
// ...
// cell.contentView.layoutIfNeeded() //
cell.label.preferredMaxLayoutWidth = cell.label.frame.width
return cell
}
ここでcellを呼び出すことに注意してください.contentViewのlayoutIfNeeded法は理論的にこの方法によって正確なcellを得ることができる.label.frame.widthですが、実測時にこの方法を使わなくてもいいです
特別ヒント
本論文の方法は理論的根拠がなく,実際の操作のみで確認可能である.
理論的にはUITableViewCellサブクラスでlayoutSubviewsを再ロードする方法がより実行可能であるが,実際のテストは直ちに有効にならず,cellの1回目の表示時に遮断される問題があり,2回目以降は正常に表示される可能性がある.
実際に実行可能な方法では、cellはまだビューにロードされておらず、label幅は計算できず、システムがどのように正しいサイズを得たのか分からない.デバッグ出力labelの幅も確かにランダムですが、表示結果は正しい++