Измененные рамки ячеек UITableView не обновляются - PullRequest
3 голосов
/ 06 мая 2011

У меня есть UITableView, размер которого я изменяю при отображении клавиатуры.

// MonoTouch code

// Resize the table so it's not hidden by the keyboard
var keyboardFrame = UIKeyboard.BoundsFromNotification(notification);
var tableFrame = myTable.Frame;
tableFrame.Height = theView.Frame.Height - keyboardFrame.Height;
myTable.Frame = tableFrame;

// Bring the current cell back in view
this.InvokeOnMainThread(()=>{
    if(currentCell != null) myTable.ScrollRectToVisible(currentCell.Cell.Frame, true);
});

Однако, когда я пытаюсь выполнить действие с этой ячейкой, чувствительное к текущему положению этой ячейки на экране (например, присоединение UIPopoverController), я обнаруживаю, что кадр этой ячейки показывает исходное местоположение до Изменение размера таблицы и прокрутка.

Я попробовал следующее, чтобы получить те же результаты, что и кадр, все еще указывающий на старое местоположение (многие из них экспериментировали, чтобы узнать, делали ли они что-нибудь, не зная, что будет работать, а что нет): *

  • Использование SetNeedsLayout для ячейки, подпредставлений таблицы, таблицы.
  • Использование LayoutIfNeeded для ячейки, подпредставлений таблицы, таблицы и представления, содержащего таблицу
  • Несколько комбинаций SetNeedsLayout и LayoutIfNeeded
  • Создает новый поток, спит в нем в течение смешного времени (чтобы пользовательский интерфейс мог выполнить перерисовку / обновление / что угодно), а затем смотрит на кадр
  • порождая новый поток, спит в течение этого нелепого времени и затем вызывает различные функции макета

Я не уверен, что происходит смена размера или прокрутка.

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

Кто-нибудь знает, как заставить UITableView обновлять кадры своих ячеек, не делая ReloadData (ReloadData вызывает много нежелательных эффектов в этом случае)?

1 Ответ

2 голосов
/ 06 мая 2011

Такое поведение ожидается. UITableView наследуется от UIScrollView. UIScrollView, кроме своего фрейма, имеет другое свойство, ContentSize. Два отдельных. В то время как фрейм представляет позицию и размер относительно своего родительского представления, ContentSize определяет область содержимого представления прокрутки, так что объект будет «знать», на какую величину прокручивать каждый раз.

Изменение фрейма или границ UITableView или любого другого представления по этому вопросу не обязательно меняет фреймы его подпредставлений. Это поведение зависит от свойства ContentMode суперпредставления.

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

Вместо этого вы должны использовать методы ConvertRectToView или ConvertRectFromView, чтобы получить прямоугольник ячейки относительно фрейма табличного представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...