2011-05-06 67 views
3

我有一个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
  • 产卵一个新的线程,该线程睡眠的时间荒谬量
  • 多种组合的视图(以便有时间对UI进行重绘/更新/不管),然后看帧
  • 产生一个新的线程,睡的时间可笑的金额,然后调用不同的布局功能

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

当您使用手势滚动表格时,单元格框架似乎被正确更新,因为我始终可以在相对于我附加到的单元格的正确位置显示弹出视图。所以我不明白为什么调整表格的大小和以编程方式滚动它们的效果不一样。

有谁知道如何强制UITableView更新它的单元格的框架而不做一个ReloadData(ReloadData在这种情况下会导致许多不需要的效果)?

回答

2

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

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

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

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

相关问题