heightForRowAtIndexPath всегда вызывается дважды - PullRequest
3 голосов
/ 16 декабря 2010

Мне трудно понять, как работает UITableViewController.В основном вот моя структура:

У меня есть tableViewController, который, конечно, содержит tableView.И здесь я использую getCellContentView и cellForRowAtIndexPath, чтобы выполнить всю работу, связанную с моими ячейками.В моей камере есть несколько UILabels со своими кадрами, по одному для каждой ориентации.Я обнаруживаю и выполняю все изменения ориентации и корректно перерисовываю кадр.Там нет проблем.Пока все хорошо.

Теперь мне нужно heightForRowAtIndexPath, чтобы вернуть 100 для ландшафта и сказать 200 для портретной ориентации.Моя проблема заключается в том, что когда я NSLog внутри него, метод вызывается дважды по любой причине, когда я вращаю tableView.Кто-нибудь знает, почему метод запускается дважды при вращении?Я подумал, что -reloadData может быть проблемой, и я проверил, вызывал ли я -reloadData по очереди как-то дважды, но нет.Я вызываю -reloadData только один раз внутри метода willRotateToInterfaceOrientation, и больше нигде в коде он не вызывается (кроме как внутри первого вызова viewDidLoad).

Почему heightForRowAtIndexPath вызывается дважды при каждом событии вращения?Также кажется, что heightForRowAtIndexPath также не может правильно определить ориентацию, когда вращение начинается. Я использую свойство ориентации строки состояния, чтобы проверить, что внутри heightForRowAtIndexPath вернуть соответствующую высоту ячейки.Любая помощь будет потрясающей!

1 Ответ

0 голосов
/ 16 декабря 2010

Кому интересно, сколько раз его зовут:)

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

Однако, если бы мне пришлось размышлять, ротация выполняется в два этапа (посмотрите на didAnimateFirstHalfOfRotationToInterfaceOrientation: и т.д. в документации UIViewController.) Вы не представляете, что делается классом UITableViewController UIKit во время ротатино - возможно, это обновление таблицы для себя?

Вы пытались переопределить willRotateToInterfaceOrientation: что должно дать вам ориентацию, к которой вы поворачиваетесь - можете ли вы использовать ее для установки высоты ячейки, которую вы хотите?

Примерно так: (предупреждение, не проверено и набрано из памяти!)

- (NSInteger)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    return rowHeight;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration];

    rowHeight = (UIInterfaceOrientationPortrait == interfaceOrientation) ? 100 : 200;
    [tableView reloadData];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...