Рамки ячеек измененного размера 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)


arrow_upward
2
arrow_downward

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

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

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

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

person Dimitris Tavlikos    schedule 06.05.2011