调整大小的UITableView的单元格框架不会更新

时间:2011-05-06 13:21:19

标签: 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 - 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有时间执行重绘/更新/无论如何),然后查看Frame
  • 产生一个新线程,睡眠时间过长,然后调用不同的布局函数

我不确定是否是调整大小或滚动是故障发生的地方。

当您使用手势滚动表格时,单元格框架似乎正确更新,因为我总是可以在相对于我将其附加到的单元格的正确位置显示弹出窗口视图。所以我不明白为什么调整表格大小并以编程方式滚动它不会做同样的事情。

有没有人知道如何在不执行ReloadData的情况下强制UITableView更新其单元格的帧(在这种情况下ReloadData会导致许多不需要的效果)?

1 个答案:

答案 0 :(得分:2)

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

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

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

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