UITableView сделал загрузку (закончил рисование ячеек) - PullRequest
6 голосов
/ 26 января 2010

Вопрос

Как вы можете определить, когда табличное представление завершает рисование ячеек?

Выпуск

Я получил две метки в contentView UITableViewCell. Размер этих меток является динамическим. Я смог сделать это, создав подкласс UITableViewCell, в методе drawRect я настраиваю кадры двух меток в зависимости от их содержимого. Теперь я хочу выровнять все вторые метки.

Мои мысли в шагах

  1. Определите содержимое в табличном представлении и дайте ему автоматически загрузиться.
  2. Пройдите через ячейки табличного представления и определите положение x второй метки в UITableViewCell, который находится дальше всего.
  3. Сохраните эту позицию x, а когда нарисована любая ячейка, используйте эту позицию x для размещения второй метки.

Проблема в том, что если я использую следующий код:

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]);        
}

Вторая метка еще не нарисована, что означает, что я не могу определить размер рамки и, следовательно, не могу найти правильную позицию x для выравнивания всех вторых меток.

Я попытался создать подкласс UITableViewController и, к сожалению, просматривать такие события, как viewDidLoad и viewDidAppear, также в этих событиях ячейки еще не прорисованы.

Что я хочу ...

Я хочу, чтобы табличное представление рисовало ячейки хотя бы один раз, чтобы я мог определить размеры меток в ячейке табличного представления. Я подумал, что это можно сделать, перебрав все ячейки с помощью cellForRow, но, хотя он успешно возвращает ячейку, содержимое еще не прорисовано, то есть кадр остается с нулевой шириной.

У кого-нибудь есть решение?

Заранее спасибо,

Mark

Ответы [ 3 ]

2 голосов
/ 30 января 2010

Попробуйте вызвать sizeWithFont: на содержимом этих ярлыков, чтобы получить максимальную ширину, прежде чем что-либо рисовать. Вы сможете использовать его позже в вашем cellForRowAtIndexPath:, чтобы отрегулировать ширину так, как вам нужно.

Я бы рекомендовал вам пересмотреть использование ячеек UITableViewCellStyleValue2 и попытаться настроить textLabel и detailTextLabel. У меня была похожая ситуация, и это , как я это сделал.

1 голос
/ 03 февраля 2010

Во-первых, вам действительно нужно просто выбрать явную фиксированную позицию, в которой заканчивается первая метка и начинается вторая, исходя из того, что вы знаете о минимальной и максимальной длине текста, который будет помещен в эти метки. , Это полностью устранило бы эту проблему.

Но если вам нужно решение: используйте метод sizeWithFont: или одного из его двоюродных братьев (см. Документы Xcode). В частности, переберите значения, которые будут указаны в первых метках, примените sizeWithFont к каждой и отслеживайте наибольшую ширину, которую вы видите. (Я предполагаю, что у вас есть доступ к значениям до того, как они попадают в ячейки; поскольку они динамические, они должны проходить через контроллер табличного представления, нет?)

Теперь у вас есть искомое значение, без необходимости выполнять чрезвычайно расточительную операцию по созданию группы объектов ячеек и никогда не использовать их по назначению.

0 голосов
/ 26 января 2010

Я думаю, вам нужно добавить viewController к , чтобы UITableViewController управлял самой UITableViewCell, чтобы вы могли фиксировать события загрузки меток.ViewController будет иметь ссылки на обе метки, поэтому он может корректировать их в соответствии с -viewDidAppear.

Я никогда не делал этого, но UITableViewCell - это представление, подобное любому другому, поэтому вы должны иметь возможность настроить контроллер для него.Возможно, вам придется вручную активировать контроллер, так как у вас нет навигационного контроллера, чтобы сделать это для вас в этом контексте.

...