在UIView

时间:2017-01-07 07:29:31

标签: swift uitableview autolayout swift3 programmatically-created

我有一个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
}()

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

e.g。

// 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

1 个答案:

答案 0 :(得分:0)

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

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

  

请注意,自动调整遮罩约束完全指定视图的大小和位置;因此,如果不引入冲突,则无法添加其他约束来修改此大小或位置。如果要使用“自动布局”动态计算视图的大小和位置,则必须将此属性设置为 false ,然后为视图提供非模糊,非冲突的约束集。

因此,在您的情况下,当您定义它时,您会错过为表格视图设置它。只需添加以下行:

tv.translatesAutoresizingMaskIntoConstraints = false