6

質問

Table View がセルの描画を完了したことをどのように検出できますか?

問題

UITableViewCell の contentView 内に 2 つのラベルを取得しました。これらのラベルのサイズは動的です。これは、UITableViewCell をサブクラス化することで実現できました。drawRect メソッドで、2 つのラベルのフレームをその内容に応じて調整します。ここで、すべての 2 番目のラベルを揃えたいと思います。

私の考えのステップ

  1. テーブル ビューでコンテンツを決定し、自動的にロードします。
  2. テーブル ビュー セルを実行し、UITableViewCell 内で最も遠い 2 番目のラベルの x 位置を特定します。
  3. この x 位置を保存し、任意のセルが描画されるときに、この x 位置を使用して 2 番目のラベルを配置します。

問題は、次のコードを使用する場合です。

for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++) {
    UITableViewCustomCell *cell = (UITableViewCustomCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0]];
    NSLog ([cell.labelTwo description]);        
}

2 番目のラベルはまだ描画されていません。つまり、フレームのサイズを特定できないため、すべての 2 番目のラベルを揃えるための適切な x 位置を見つけることができません。

UITableViewController をサブクラス化し、viewDidLoad や viewDidAppear などのイベントを調べてみましたが、残念ながらこれらのイベントでもセルはまだ描画されていません。

私が欲しいもの...

私が望むのは、テーブル ビューでセルを少なくとも 1 回描画して、テーブル ビュー セル内のラベルのサイズを決定できるようにすることです。cellForRowですべてのセルをループすることでこれを達成しようと考えましたが、セルは正常に返されますが、コンテンツはまだ描画されていないため、フレームの幅はゼロのままです。

誰にも解決策がありますか?

前もって感謝します、

マーク

4

3 に答える 3

2

sizeWithFont:何かを描画する前に、これらのラベルの内容を呼び出して最大幅を取得してみてください。cellForRowAtIndexPath:後で必要に応じて幅を調整するために使用できるはずです。

UITableViewCellStyleValue2代わりにセルの使用を再検討し、textLabel と detailTextLabel の構成を試みることをお勧めします。私も似たような状況で、これが私がやった方法です。

于 2010-01-29T23:20:41.587 に答える
1

まず、最初のラベルが終わり、2 番目のラベルが始まる明確な固定位置を選​​択する必要があります。これらのラベルに配置されるテキストの最小長と最大長について知っていることに基づいてください。そうすれば、この問題は完全に解消されます。

ただし、解決策が必要な場合は、sizeWithFont:メソッドまたはそのいとこの 1 つを使用してください (Xcode のドキュメントを参照してください)。具体的には、最初のラベルに入る値をループし、sizeWithFontそれぞれに適用して、表示される最大幅を追跡します。(セルに入る前に値にアクセスできると仮定しています。値は動的であるため、テーブルビューコントローラーを通過する必要がありますか?)

これで、多数のセル オブジェクトを作成し、それらを本来の目的に使用しないという非常に無駄な操作を実行する必要なく、求める価値が得られます。

于 2010-02-03T08:29:06.110 に答える
0

あなたがする必要があるのは、viewController を追加して、UITableViewController が UITableViewCell 自体を制御できるようにして、ラベルの読み込みのイベントをキャプチャできるようにすることだと思います。viewController は両方のラベルへの参照を持つため、に応じてラベルを調整できます-viewDidAppear

私はこれをやったことがありませんが、 UITableViewCell は他のビューと同じなので、コントローラーをセットアップできるはずです。このコンテキストで実行するためのナビゲーション コントローラーがないため、コントローラーを手動でアクティブ化する必要がある場合があります。

于 2010-01-26T16:19:59.667 に答える