У меня есть табличное представление, содержащее переменное количество разделов и пользовательских ячеек. В некоторых случаях размер ячейки может изменяться в 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 () привязан к старому размеру содержимого таблицы - даже после перезагрузки строк. Я попытался обойти это, предоставив новый размер контента с вычисленной разницей в высоте. Это работает, но мне кажется, что это действительно так.
Есть ли какой-нибудь более чистый способ делать вещи?
Заранее спасибо