使用swift iOS8通过代码将约束设置到Storyboard中的元素

我有一个ViewView的一个ViewController。 我已经在故事板中设置了它。 有没有办法以编程方式设置tableView的约束? 我试图在ViewController中从我的tableView中设置一个IBOutlet,并添加约束条件。 但是这没有用。

这是我的ViewController

import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() addTableViewConstraints() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func addTableViewConstraints() { tableView.setTranslatesAutoresizingMaskIntoConstraints(false) var topConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 20) var leadingContraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0) var trailingConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0) var bottomConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0) self.view.addConstraints([topConstraint, leadingContraint, trailingConstraint, bottomConstraint]) } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell cell.textLabel?.text = "Cell" return cell } } 

或者我必须通过代码来制作我的tableView?

谢谢!

您在其中一条评论中提到,当用户按下button时,您想更改约束条件。 您可以通过制定约束条件来以较less的代码实现这一点。 在文档大纲页面中find约束,然后按CTRL +拖动到您的类以创build约束的出口。 那么你可以更容易地更改代码中的常量。

 @IBOutlet weak var topConstraint: NSLayoutConstraint! @IBOutlet weak var bottomConstraint: NSLayoutConstraint! func buttonPressed() { if (/* some condition */) { self.topConstraint.constant += 8 self.bottomConstraint.constant += 8 } else { // Return the constraints to normal, or whatever you want to do } } 

以下面的方式改变你的方法addTableViewConstraints

 func addTableViewConstraints() { tableView.setTranslatesAutoresizingMaskIntoConstraints(false) var topConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 20) var leadingContraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0) var trailingConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0) var bottomConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0) NSLayoutConstraint.activateConstraints([topConstraint, leadingContraint, trailingConstraint, bottomConstraint]) } 

更新:

您正在运行(以及导致exception)的NSIBPrototypingLayoutConstraint约束是由Interface Builder自动生成的,以使您的Storyboard或XIB视图布局不含糊。 这样做很偷偷摸摸,但它会自动添加所需的最小约束,以便每个模糊视图的位置和大小都被完全指定。

解决此问题的方法是在Interface Builder中添加所需的最小约束条件,以便完全指定每个视图的位置和大小,然后select这些不需要的约束条件,转到右侧边栏属性检查器,然后选中占位符旁边的框– 在构build时删除

我通过以下方式解决了这个问题:

  1. 打开你正在处理的Storyboard视图控制器。
  2. select你的UITableView
  3. select视图控制器,然后从菜单中select编辑器>解决自动布局问题>select视图[]视图控制器>添加缺less约束

在这里输入图像说明

  1. 从表格视图中select所有约束:

在这里输入图像说明

  1. 从右窗格中检查以下checkbox: 占位符 – 在构build时删除

在这里输入图像说明

现在,您可以在代码中手动添加所有自动布局约束,并且不会有任何警告。

我希望这可以帮助你。

假设您有一个名为myButton的button,您希望通过代码创build其“ Bottom Space约束。 该约束的constant将被设置为500

这是Swift中NSLayoutConstraint样子。 确保在一个函数中包含这个代码。

  var constraintButton = NSLayoutConstraint (item: myButton, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 500) // Add the constraint to the view self.view.addConstraint(constraintButton)