在 UIView 内对 UITableView 设置约束

Posted

技术标签:

【中文标题】在 UIView 内对 UITableView 设置约束【英文标题】:Setting constraints on UITableView inside UIView 【发布时间】:2017-01-07 07:29:30 【问题描述】:

我有一个 UIViewController,它有一些基本控件,并且在中心有一个 UIView(作为可交换 ui 控件的容器)。我根据用户尝试执行的操作替换了该中心 UIView(容器)中的 UI 控件。进入 UIView 容器的所有 UI 控件都是以编程方式定义的,我使用编程约束将它们放置在 UIView 容器中。

这适用于我迄今为止所做的所有 UI 控件集。现在我正在向包含 UITableView 的 UIView 容器添加一组控件

我不知道如何让 TableView 以编程方式显示在 UIView 中。我可以定义一个按钮和标签并运行应用程序并查看带有按钮和标签的容器。如果我如下添加 UITableView,则容器根本不会显示。

// tableView
tableView.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: inputsContainerView.bottomAnchor).isActive = true
tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor, multiplier: 1/2).isActive = true

在上面的代码之前,我已经将所有需要的控件添加到容器子视图中......

// Add controls to the view
inputsContainerView.addSubview(listTextView)
inputsContainerView.addSubview(listImageButton)
inputsContainerView.addSubview(listImageClear)
inputsContainerView.addSubview(tableView)

如果我不使用 tableview,那么容器会与其他三个字段一起显示。如果我添加 tableview,那么容器和所有其他三个控件都消失了。

如何将 tableView 添加到 UIView 并显示出来?

这是我定义 UITable 视图的方式

let tableView: UITableView =  
    let tv = UITableView()
    return tv
()

作为比较,当我像这样定义其他控件时,它们在添加到子视图并以编程方式设置约束后显示良好

例如

// DEFINE
let listTextView: UITextView = 
    let textView = UITextView()
    textView.translatesAutoresizingMaskIntoConstraints = false
    textView.text = ""
    textView.textColor = defaultTextColor
    textView.font = subtitleFont
    textView.layer.borderColor = UIColor.black.cgColor
    textView.layer.borderWidth = 1
    textView.textAlignment = NSTextAlignment.left
    return textView
()

后来

// Place - with constraints
// listTextView
listTextView.leftAnchor.constraint(equalTo: inputsContainerView.leftAnchor, constant: padFromLeft).isActive = true
listTextView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor, constant: 10).isActive = true
listTextView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor, multiplier: 9/16).isActive = true
listTextView.heightAnchor.constraint(equalTo: inputsContainerView.widthAnchor, multiplier: 5/16).isActive = true

【问题讨论】:

您能否将tv.translatesAutoresizingMaskIntoConstraints = false 添加到您的表格视图属性中,看看之后会发生什么 你为什么不使用show hide?​​span> 谢谢!添加 tv.translatesAutoresizingMaskIntoConstraints = false 是答案。 @john 很好,很高兴能帮到你。我只是将我的评论添加为详细的答案,以便其他人可以更好地从中受益。如果您觉得冷,那就太好了,只需将其标记为正确,这也将有助于其他人节省时间。谢谢 【参考方案1】:

刚刚将我的评论添加为详细答案,以便其他人可以更快地看到解决方案并从中受益。

所以取自apple documentation,要以编程方式设置自己的约束,需要设置translatesAutoresizingMaskIntoConstraints to false

请注意,自动调整掩码约束完全指定了视图的大小和位置;因此,您不能添加额外的约束来修改此大小或位置而不引入冲突。如果要使用 Auto Layout 动态计算视图的大小和位置,则必须将此属性设置为 false,然后为视图提供一组明确、不冲突的约束。

所以在你的情况下,当你定义它时,你错过了为你的表格视图设置它。只需添加这一行:

tv.translatesAutoresizingMaskIntoConstraints = false

【讨论】:

以上是关于在 UIView 内对 UITableView 设置约束的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 UIView 没有出现在 UITableView 前面?

子类 uitableview 已经在 UIView 中

UITableView 与单元格下方的 UIView

在 UITableViewController 中将 UIView 放在 UITableView 前面

在 UIView 中加载 UITableView

根据 UIView 约束更新 UITableView 大小