使用自定义UITableView子视图

时间:2013-11-28 14:03:15

标签: ios objective-c uitableview

我有一个表格视图控制器,我drag-and-drop an additional UIView on a storyboard to make a header,它成为UITableView的子视图。

使其成为viewForHeaderInSection:和朋友的“官方”标题标题(我将解释原因),它只是表格视图的子视图,显示在顶部该表的内容,以及视图层次结构中的内部表视图包装器和刷新控件视图。

层次结构如下所示:

UITableView 0,0 320x455
  UIRefreshControl 0,0 320x60
  UITableViewWrapperView 0,0 320x455
    cell 0,190 320x44
    cell 0,146 320x44
    cell 0,102 320x44
    cell 0, 58 320x44
  custom UIView 0,0 320x58

现在,标题视图效果很好......直到我想调整它的大小。这个想法是,标题视图有一个文本字段,当聚焦时,会导致其他表单字段在其下展开,从而推动表格单元格。

问题在于我几乎无法控制细胞的排列。在调整自定义视图大小时(通过更改其框架),它会覆盖表包装器视图。

那么,为什么我不把它作为章节标题视图并通过heightForHeaderInSection:调整大小?问题是当一个文本字段被聚焦或输入时,我需要调用[self.tableView reloadData]来刷新表中的数据(按类型搜索),它会重新加载标题并使文字领域失去焦点。

总结一下,

  1. 如何实际制作可以动态调整大小并按下表格单元格的表头?
  2. 如何在重新加载表格时将文本视图的焦点保持在表头中?

2 个答案:

答案 0 :(得分:1)

tableHeaderView的解决方案(与节标题视图无关):

  1. 将拖动的视图(或任何视图)分配给self.tableView.tableHeaderView
  2. 如果您想更改其高度change its frame and assign it again
  3. 视图将以新的高度重绘,但文本字段将保持其焦点。

答案 1 :(得分:0)

我还发现您需要将标题视图重新分配给表视图的tableHeaderView属性,以使其正确展开。我接下来试图找出如何动画效果。我可以使用NSTimer,在每次增量增加后重置表视图的tableHeaderView属性,但这看起来有点不稳定。试图在动画块中为它设置动画,导致了几个奇怪的效果 - 如果我在动画块中更改了高度(并重新分配了tableHeaderView属性),它可以适用于小尺寸增加,但是较大的效果会导致一些单元格动画开始时从屏幕底部消失(虽然在动画结束时,一切都很好)。最后,我发现更改表视图本身的高度,并在完成块中将其更改回原始大小,以及在完成块中更改标题的大小(再次)使一切正常。

-(void)growHeaderBy:(NSInteger) delta {
    [UIView animateWithDuration:.6 animations:^{
        self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.tableView.frame.size.height + delta);
        self.header.frame = CGRectMake(self.headerFrame.origin.x, self.headerFrame.origin.y, self.headerFrame.size.width, self.headerFrame.size.height + delta);
        self.tableView.tableHeaderView = self.header;
    } completion:^(BOOL finished) {
        self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.tableView.frame.size.height - delta);
        self.header.frame = CGRectMake(self.headerFrame.origin.x, self.headerFrame.origin.y, self.headerFrame.size.width, self.headerFrame.size.height + delta);
        self.tableView.tableHeaderView = self.header;
    }];
}

headerFrame是一个设置为viewDidLoad中标题视图原始帧的属性。