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