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

最好的解决方案是从 IB 执行此操作,但也欢迎程序化解决方案。

编辑:

这是它在我的故事板中的外观(颜色用于可视化单独的控件,每个控件都有所需的约束):故事板视图控制器

启动后:模拟器视图 请注意,文本视图在屏幕底部下方结束。

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

#1楼 票数:73

您实际上可以将UITableViewAutomaticDimension与静态单元格一起使用。 按照惯例设计您的静态单元格,并通过添加手动将您的单元格设置为动态高度

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

现在覆盖heightForRow委托

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return UITableView.automaticDimension
}

我注意到这种技术的唯一其他警告是您必须使用NSAutolayout创建对底部容器( UITableViewCell的容器)的约束。 因此,假设您在单元格的 contentView 中有一个具有动态高度的容器,为了正确呈现,您需要创建底部空间约束。

如果您有一些具有固定高度的静态单元格,我建议通过在tableView:heightForRowAtIndexPath:indexPath切换行来返回该大小

#2楼 票数:12

一定要覆盖 heightForRowAtIndexPath! 否则根据我的经验它将无法正确显示

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

#3楼 票数:6 已采纳

好的试试这个

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 高度之前运行

#4楼 票数:4

我在一篇使用静态表格视图并使用自动布局设置单元格高度的博客文章中介绍了这一点。 这些单元格都在界面构建器中定义。

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

我展示了一切,包括 IB 和代码。

看一看

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

#5楼 票数:3

如果整个 tableview 单元格高度是动态的,那么你可以试试这个

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 240

或者 tableview 需要一些固定高度的单元格和一些动态高度的单元格,您可以查看答案Dynamic & static tableview cell height

希望能帮助到你。

#6楼 票数:1

来自 IB 和使用 Autolayout 不确定

但是以编程方式使用,

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

使用此方法您可以检查 indexpath.row。 并使用此返回不同的高度。

#7楼 票数:1

Ryan Romanchuk 的回答很棒。 我有一个提示可以帮助像我这样的初学者。

由于这是一个静态单元格案例,您可能倾向于对每个动态字段使用IBOutlet tableView加载周期之外的UILabel设置值不会考虑新的高度。

为了允许动态高度工作,您可以在覆盖的cellForRowAtIndexPath委托中分配值,以便自动布局可以选择新高度。 当您想要更新字段时调用tableView.reloadData()

#8楼 票数: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];
}

  ask by bpiec translate from so

未解决问题?本站智能推荐:

2回复

如何让一个按钮保持在一个单元格的所有大小的右侧?

我想在我的故事板中添加一个自定义复选框按钮( https://codereview.stackexchange.com/questions/69123/ibdesignable-uicheckbox )到我的Prototype Table View Cell。 这是一张专辑的结尾,从它的所
3回复

如何使用 XCode 7 在 Storyboards 中将视图高度设置为屏幕高度的百分比

我需要设计如下图所示的视图,我尝试过固定高度,也尝试过紧凑宽度和常规高度以及常规宽度和紧凑高度,但这些场景对我不起作用。 如何将视图高度设置为故事板中屏幕高度的百分比? 我正在使用 Xcode 7
1回复

使用autolayout将UIView设置为UITableViewCell内容视图的一半高度

我有一个UITableViewCell , UIView作为子视图。 我希望UIView的高度(深蓝色矩形)始终等于UITableViewCell内容视图高度的一半。 我知道我应该在UIView和单元格内容视图之间设置一个约束,但是当我在UIView和单元格内容视图之间进行ctrl拖动时
1回复

如何在Storyboard / Interface Builder中使UIImageView成为UICollectionViewCell高度的一半

我对如何将嵌入在UICollectionViewCell的UIImageView设置为该单元格高度的一半感到困惑。 当我尝试在两者之间创建约束时,似乎没有一个高度选项。 如果不去研究代码,这种事情可能吗?
1回复

在Storyboard中指定UIToolbar的高度

当我尝试通过Storyboard更改UIToolbar的高度时,该选项显示为灰色。 我知道我可以以编程方式执行此操作,但是有没有其他方法可以在我的故事板上执行此操作,可能使用不同的界面项? 最好将它全部放在故事板上,以避免代码混淆。 或者我不应该改变高度 - 是否可能从应用商店拒绝它
1回复

在Interface Builder中设置后,我应该如何观察UILabel文本的更改?

我正在构建一个UILabel库,该库主要旨在以编程方式使用,但我也希望它也可以与Interface Builder一起使用。 当用户在UILabel子类上调用setText时,我在那里观看并根据标签的使用更新了文本,但是IB似乎没有调用它。 我应该只是看awakeFromNib吗?
3回复

如何在故事板或xib中选择背景视图

如果我在故事板或xib中用鼠标选择视图,Xcode将选择最前面的视图。 我知道我可以在文档大纲中选择其他视图,但如果我想抓住背景视图用鼠标移动它,当我点击故事板时,最前面的视图会再次被选中。 我认为有一种方法可以循环浏览视图并通过按住某些键来选择后面的视图,但我找不到它是什么。 有人知
3回复

Cocos2d + Storyboards,我怎样才能获得一个有效的项目?

编辑:接受/赏金给任何能告诉我如何制作项目的人: 使用Cocos2d 2.x. 有故事板 有ARC 如果您提供模板的下载链接,则可获得奖励 上一个问题变得一团糟,我自己已经解决了这个问题。 如果有人想要制作更好的项目版本,赏金仍然可以争夺。 这是