UITableView.ScrollRectToVisible () не прокручивается вниз - PullRequest
1 голос
/ 13 апреля 2011

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

Есть ли какой-нибудь более чистый способ делать вещи?

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

1 Ответ

7 голосов
/ 14 апреля 2011

Вместо этого используйте:

tableView.ScrollRectToVisible(_: animated: )

Используйте его для прокрутки UITableView в нижний ряд:

tableView.scrollToRow(at: at: animated: )
...