Ios 调整大小的UITableView';s单元';帧不会被更新

Ios 调整大小的UITableView';s单元';帧不会被更新,ios,uitableview,xamarin.ios,Ios,Uitableview,Xamarin.ios,我有一个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 - key

我有一个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
  • 使用单元格上需要的LayoutIfNeed,表的子视图、表和包含表的视图
  • SetNeedsLayout和LayoutIfNeed的多种组合
  • 生成一个新线程,在该线程上休眠一段荒谬的时间(以便UI有时间执行重画/更新/任何操作),然后查看帧
  • 产生一个新的线程,睡那么长时间,然后调用不同的布局函数
我不确定是调整大小还是滚动才是故障发生的地方

当您使用手势滚动表格时,单元格框似乎得到了正确更新,因为我始终可以在与所附着单元格相关的正确位置显示popover视图。因此,我不明白为什么调整表的大小和以编程方式滚动表不会有同样的效果


是否有人知道如何强制UITableView在不重新加载数据的情况下更新其单元格的帧(在这种情况下,重新加载数据会导致许多不必要的影响)?

这是预期的行为。UITableView继承自UIScrollView。UIScrollView除了其框架外,还有另一个属性ContentSize。两者是分开的。框架表示相对于其父视图的位置和大小,而ContentSize定义了滚动视图内容的区域,因此对象将“知道”每次滚动的量

更改UITableView的框架或边界,或任何与此相关的视图,并不一定会更改其子视图的框架。此行为取决于superview的ContentMode属性

无论如何,表格单元格的框架不会更改,因为它们与ContentSize属性相关。因为它在调整表视图的大小之前工作正常,所以我只能假设表视图的ContentSize和Frame在该点匹配。调整表视图的大小后,ContentSize保持不变,因此这两个值之间存在不一致

相反,您应该使用ConvertRectToView或ConvertRectFromView方法来获取单元格相对于tableview框架的矩形