23

Interface Builder で自動レイアウト制約が適用されたカスタムUITableViewCellサブクラスがあります。セルには、 を含む複数のビューが含まれていますUITextField

関連して、 のサイズは、UITextFieldそれと次のビューの間にデフォルトの水平方向のスペースがあるように制限されています。

セルは次のようにインスタンス化されます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ProgressCell";
    ProgressCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier
                                                     forIndexPath:indexPath]

    cell.textField.text = @"Some string that is different for each cell";

    return cell;
}

セルが最初に表示されるとき、UITextFieldは正しいフレームをオーバーランし、 の後ろのUIView右側に表示されます。ただし、セルを画面外にスクロールし、一時停止してから戻ると、テキストが正しく切り捨てられます。

以下に例を示します (2 回目の編集時)。

[cell setNeedsLayout][cell setNeedsDisplay]のセルを呼び出してみcellForRowAtIndexPathましたが、遅れて実行しました。どちらも効果的ではありません。

セルが正しく表示される原因となっている画面外へのスクロールは何ですか?また、これを再現するか、根本的な問題を修正するにはどうすればよいですか?

編集:

通話中

[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

セルをリロードするために、レイアウトが最初に正しく表示されるように見えます。

ただし、スクロールすると (時折)中断するようになりました (つまり、上にスクロールすると、レイアウトの制約が正しく適用されません)。

電話[cell setNeedsLayout]をかけても、cellForRowAtIndexPathこの問題は解決しないようです。

EDIT2:

画面を下にスクロールするまで、ここに示すように、一番上のセルが (一番下のセルと同様に) 正しく表示されました。それ以来、それは消えました。

これは、最初の編集時点での問題を反映しています。問題は 2 番目のレンダリングです (セルの再利用と関係があるのではないかと思います)。

4

3 に答える 3

37

UITableViewCellサブクラスtextLabelまたはのプロパティに名前を付けるとdefaultTextLabel、IBは指定された制約を無視し、警告を出さずにデフォルトの制約でオーバーライドします。

これは、IBでカスタムスタイルで設計されたセルにも当てはまります。セルには表示textLabeldetailTextLabelプロパティがありません。

UIImageViewこれは、UITableViewCellサブクラスにpropertyタイプのプロパティを追加し、名前を付けた場合にも発生しimageViewます。

于 2013-02-21T23:53:46.443 に答える
8

この複数行のUILabelGitHub の問題によると、これは長引く iOS のバグです。

iOS 9 以降では、この状況は主に編集モードで発生し、予測がつかないことがわかりました。

次の回避策は部分的にしか機能しません: 2 回再描画する必要がありUITableView、それでもすべてのシナリオをカバーしているわけではありません。

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()
    tableView.reloadData()
}

ノート:

  • Usingは、バグのないUITextView複数行の優れた代替手段です。アライメントエラーやちらつきなど、他の奇妙な点も見られません。UILabelUITextViewIULabel
  • SO-25947146には代替ソリューションもありますが、これは私にとってはうまくいきませんでしたが、言及する価値があります。
  • のときに顕著に発生するようself.tableView.editingですtrue
  • に低い値を使用tableView.estimatedRowHeightすると、発生が減少します
  • SwiftArchitect/TableViewControllerRowHeightBug gistのバグのデモンストレーション
于 2016-02-06T01:10:56.760 に答える