以编程方式添加约束会导致崩溃

时间:2017-04-27 08:21:15

标签: swift swift3 constraints nslayoutconstraint

当我从底部的新表格视图中滑动时,我想以编程方式添加一些约束,但到目前为止,我无法理解我做错了什么。在我的super view map view我必须更改bottom constraint,以便在点击按钮时为新tableView腾出空间。

基本上我的表视图我需要4个约束:

  • top constaint to the map bottom
  • 标签栏顶部约束的底部约束
  • 超级视野中的领先和trailinf

我一直在崩溃:

  

无法设置具有视图层次结构的布局,无法用于约束。

基于以下设置约束:here

这是一段代码:

@IBAction func test(_ sender: UIButton) {
        let tableView = UITableView()
        tableView.backgroundColor = UIColor.red
        tableView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(tableView)

        let topConstraint = NSLayoutConstraint(item: tableView, attribute: .top, relatedBy: .equal, toItem: self.mapView, attribute: .bottom, multiplier: 1, constant: 0)
        let bottomConstraint = NSLayoutConstraint(item: tableView, attribute: .bottom, relatedBy: .equal, toItem: self.tabBarController?.tabBar, attribute: .top, multiplier: 1, constant: 0)
        let leadingConstraint = NSLayoutConstraint(item: tableView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 0)
        let trailingConstraint = NSLayoutConstraint(item: tableView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 0)

        view.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint])
//        tableView.addConstraint(NSLayoutConstraint(item: tableView, attribute: .top, relatedBy: .equal, toItem: self.mapView, attribute: .bottom, multiplier: 1, constant: 0))
//        tableView.addConstraint(NSLayoutConstraint(item: tableView, attribute: .bottom, relatedBy: .equal, toItem: self.tabBarController?.tabBar, attribute: .top, multiplier: 1, constant: 0))
//        tableView.addConstraint(NSLayoutConstraint(item: tableView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 0))
//        tableView.addConstraint(NSLayoutConstraint(item: tableView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 0))

        self.view.layoutIfNeeded()
        UIView.animate(withDuration: 0.5, animations: {
            self.mapBottomConstaint.constant = 200
            self.centerButtonBottomConstaint.constant = 208
            self.view.layoutIfNeeded()
        })
    }

1 个答案:

答案 0 :(得分:2)

您正尝试将约束设置为视图层次结构之外的视图。自动布局系统提供布局指南,以帮助您将视图与导航栏和标签栏对齐。

在您的底部约束中,将self.tabBarController?.tabBar替换为bottomLayoutGuide

作为旁注,新的布局语法(在iOS 9+上可用)可以更轻松地创建没有第三方库的编程约束:

let topConstraint = tableView.topAnchor.constraint(equalTo: mapView.bottomAnchor)
let bottomConstraint = tableView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor)
let leadingConstraint = tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor)
let trailingConstraint = tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)

有关创建程序化约束的更多信息here