添加约束programmaticaly使崩溃

问题描述:

我想添加programmaticaly几个constarints,当我从底部的新表视图滑动,但到目前为止,我不明白我做错了什么。在我的super view我有map view必须更改bottom constaint为单击按钮时新的tableView留出空间。添加约束programmaticaly使崩溃

Bacically我的表视图,我需要4个constaints:

  • 顶部constaint到地图底部
  • 底部constarint标签栏顶部constarint
  • 领导和trailinf从超级视图

所有时间我碰到:

Impossible to set up layout with view hierarchy unprepared for constraint. 

基于从设定限制: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

@PremaJanoti你说得对,他们不是! – yerpy

+0

现在工作吗? –

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

在底部约束条件中,将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信息。