UITableView загрузил (сделал рисование ячеек)

Вопрос

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

Проблема

У меня есть две метки в 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, но, хотя он успешно возвращает ячейку, содержимое еще не отрисовывается, что означает, что рамка остается с нулевой шириной.

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

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

отметка


person Mark    schedule 26.01.2010    source источник


Ответы (3)


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

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

person Ahmed Abdelkader    schedule 29.01.2010

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

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

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

person lawrence    schedule 03.02.2010

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

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

person TechZen    schedule 26.01.2010
comment
В документах указано, что UIViewControllers предназначены для полноэкранных представлений (не считая панели навигации, панели вкладок и т. д.). Вы можете немного изменить это правило, но наличие контроллера для UITableViewCell — это безумие, особенно потому, что UITableView создает и уничтожает их на лету. Примечание. Не следует использовать контроллеры представлений для управления представлениями, которые заполняют только часть своего окна, то есть только часть области, определяемой прямоугольником содержимого приложения. Если вы хотите иметь интерфейс, состоящий из нескольких небольших представлений, встройте их все в одно корневое представление и управляйте этим представлением с помощью контроллера представления. - person lawrence; 03.02.2010
comment
Да, было бы лучше, чтобы UITableViewController управлял ячейками. Я изменю ответ, чтобы отразить это. - person TechZen; 03.02.2010