Autolayoutまたは制約を使用して複数行のテキストLabelをレイアウトし、高度に不正確な(文字の切り捨て)解決策

1171 ワード

問題の説明
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の幅も確かにランダムですが、表示結果は正しい++