我有一个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的组合。 - 生成一个新线程,在该线程上睡眠一段荒谬的时间(以允许UI执行重绘/更新/其他操作),然后查看框架。 - 生成一个新线程,在该线程上睡眠一段荒谬的时间,然后调用不同的布局函数。
我不确定故障出现在调整大小还是滚动过程中。
当您使用手势滚动表格时,单元格框架似乎会正确更新,因为我始终可以在正确的位置相对于要附加的单元格显示弹出窗口视图。因此,我不明白为什么以编程方式调整大小和滚动表格不会产生相同的效果。
有没有人知道如何强制UITableView更新其单元格框架而不进行ReloadData(在这种情况下,ReloadData会导致许多不需要的效果)?