У меня есть табличное представление, содержащее переменное количество разделов и пользовательских ячеек. В некоторых случаях размер ячейки может изменяться в RowSelected(). Всякий раз, когда это происходит, я также хотел бы убедиться, что ячейка полностью видна после изменения ее размера (увеличения).
У меня это работает в другой таблице, которая просто изменяет базовые данные, чтобы источник табличного представления предоставлял большую ячейку. Затем я перезагружаю ячейку и прокручиваю ее так:
// Modify data
//...
// Reload cell
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.None);
tableView.ScrollRectToVisible(tableView.CellAt(indexPath).Frame, true);
Проблема возникает в табличном представлении, где изменение размера может быть вызвано не только функцией RowSelected(), но и событиями в элементах пользовательского интерфейса внутри ячеек.
Затем события вызывают метод для перезагрузки ячейки:
void updateCell() {
if (cell.Superview != null) {
UITableView tableView = (UITableView)cell.Superview;
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.None);
// Get the new (possibly enlarged) frame
RectangleF frame = tableView.CellAt(indexPath).Frame;
Console.WriteLine("This really is the new large frame, height: {0}", frame.Height);
// Try to scroll it visible
tableView.ScrollRectToVisible(frame, true);
}
}
Это отлично прокручивается для всех ячеек, кроме самой нижней. Это только делает видимой старую рамку этой ячейки. Я дважды проверил, что он действительно предоставляет новую рамку ячейки для ScrollRectToVisible().
Таким образом, кажется, что ScrollRectToVisible() привязан к старому размеру содержимого таблицы - даже после перезагрузки строк. Я попытался обойти это, предоставив новый размер контента с рассчитанной разницей в высоте. Это работает, но кажется мне действительно хакерским.
Есть ли какой-то более чистый способ сделать что-то?
заранее спасибо