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

3

我有一个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会导致许多不需要的效果)?
1个回答

2
这种行为是正常的。UITableView继承自UIScrollView。除了其frame之外,UIScrollView还有另一个属性ContentSize。这两个属性是分开的。虽然frame表示相对于其父视图的位置和大小,但ContentSize定义了滚动视图内容区域的大小,以便对象每次"知道"要滚动多少。
更改UITableView或任何视图的frame或bounds不一定会更改其子视图的frame。这种行为取决于父视图的ContentMode属性。
无论如何,表格单元格的frame不会改变,因为它们与ContentSize属性相关。由于在调整表格视图大小之前它可以正常工作,我只能假设此时ContentSize和Frame匹配。调整表格视图大小后,ContentSize保持不变,因此两个值之间存在不一致。
相反,您应该使用ConvertRectToView或ConvertRectFromView方法来获取单元格相对于tableview frame的矩形。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接