2015-03-31 169 views
20

我正在使用IB和故事板,并且我定义了UITableViewController。在那里我定义了三个静态单元。前两个应该有一个给定的高度,但最后一个应该自动填充剩余的空间(锚定到视图的底部)。我怎样才能做到这一点?我可以在内部的控件中使用自动布局,但它对于单元格本身灰显。如何在UITableViewController中设置静态单元的自动高度?

最好的解决方案是从IB那里做到这一点,但也欢迎程序化解决方案。

编辑:

这是怎么看我的故事板(颜色用于可视化单独控制,每个控制已要求约束): Storyboard view controller

和发射后: Simulator view 注意文本视图结束于屏幕底部下方。

我忘了提及我的目标是iOS 7.0+。

回答

5

好的尝试这种

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{ 

    if indexPath.row == 0 { 
     return firstRowHeight 
    } 
    else if indexPath.row == 1 { 
     return secondRowHeight 
    } 
    else { 
     return tableView.frame.size.height - firstRowHeight - secondRowHeight 
    } 
} 

这可能是一个问题是,这种方法是要运行该视图设置的tableView高度之前唯一

+0

这是目前最好的选择。但是,我需要为第三行减去63个像素,也许这是导航栏? – bpiec 2015-03-31 17:55:08

+0

所以63(好的,实际上是64)是导航栏的高度+状态栏的高度。有点奇怪我'tableView'高度确实包含了他们...... – bpiec 2015-03-31 18:10:53

+0

通常你不应该减去导航。酒吧高度。使用视图调试来查看实际的tableView高度。 – 2015-03-31 19:44:46

0

从IB不知道,并使用自动布局

但是,使用编程方式,

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

使用这种方法ü可以检查indexpath.row。并且使用这返回不同的高度。

+0

当然,我知道这个方法,但问题是我应该返回第三行... – bpiec 2015-03-31 17:36:42

0

对于静态(非数据驱动的)高度,你可以出列的单元格一次,并存储高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSNumber *height; 
    if (!height) { 
     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomCell"]; 
     height = @(cell.bounds.size.height); 
    } 
    return [height floatValue]; 
} 
+0

我不明白这可以如何帮助我... – bpiec 2015-03-31 17:37:05

3

我使用静态表视图覆盖这在一篇博客文章,并设置电池使用自动布局的高度。单元全部在界面构建器中定义。

您必须在代码中启用自动单元格高度,但这只是几行。

我显示包括IB和代码在内的所有内容。

看看

http://www.oliverfoggin.com/using-a-static-uitableview-as-a-layout-device/

+0

这是它的样子,当我设置约束并返回'UITableViewAutomaticDimension'为身高:[链接](http://i.imgur.com/4Xj3lIn.png?1)(参考更新的问题以供参考)。我也忘了提及我的目标是iOS 7.0+。 – bpiec 2015-03-31 17:50:39

51

你实际上可以使用UITableViewAutomaticDimension静态单元格。设计往常一样的静态细胞和手动添加

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 240 // Something reasonable to help ios render your cells 

设置你的细胞作为动态的高度现在覆盖heightForRow委托

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

唯一的另外一点我用这种方法注意到的是,你必须使用NSAutolayout为底部容器(UITableViewCell的容器)创建一个约束。假设你在单元格的contentView中有一个容器,它具有动态高度,为了正确渲染,你需要创建一个底部空间约束。

如果有确实有tableView:heightForRowAtIndexPath:indexPath

+8

使用Autolayout不是一个警告,它是一个功能! – SwiftArchitect 2016-02-07 02:18:59

+0

适合我。我还实现了'tableView.reloadData()',以便在更改此静态单元格中的内容时重新计算我的单元格高度。 – Andrej 2016-02-26 13:10:41

+0

@SwiftArchitect非常真实,我想我的意思是“不要忘记”你的底部约束 – 2016-02-26 18:22:08

7

固定高度,我建议通过逐行切换是大小返回某些静态细胞一定要覆盖heightForRowAtIndexPath!要不然也不会从我的经验,正确显示

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    return UITableViewAutomaticDimension 
} 
1

如果整个的tableview细胞高度是动态的,那么你可以试试这个

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 240 

或tableview中需要一些固定的高度单元&一些动态高度单元的你可以结帐答案 Dynamic & static tableview cell height

希望它有帮助。

相关问题