Рамки ячеек измененного размера UITableView не обновляются

У меня есть 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 вызывает много нежелательных эффектов)?


person Obishawn    schedule 06.05.2011    source источник


Ответы (1)


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

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

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

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

person Dimitris Tavlikos    schedule 06.05.2011