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

Set constraints through code to an element from Storyboard with swift iOS8

我有一个带有 tableView 的 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?

谢谢!

假设您有一个名为 myButton 的按钮,您希望通过代码创建其 Bottom Space 约束。该约束的 constant 将设置为 500.

这是 NSLayoutConstraint 在 Swift 中的样子。确保将此代码包含在函数中。

    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)

按以下方式更改您的方法 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])
}

UPDATE:

您 运行 进入的 NSIBPrototypingLayoutConstraint 约束(并且会导致异常)是由 Interface Builder 自动生成的,目的是使您的 Storyboard 或 XIB 视图布局明确无误。这样做很狡猾,但它会自动添加所需的最小约束,以便完全指定每个模糊视图的位置和大小。

解决此问题的方法是在 Interface Builder 中添加所需的最小约束,以便完全指定每个视图的位置和大小,然后 select 每个不需要的约束,转到右侧栏属性inspector,然后选中 Placeholder - Remove at build time.

旁边的框

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

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

  1. Select 您 table 视图中的所有约束:

  1. 从右窗格中选中以下复选框:占位符 - 在生成时删除

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

希望对你有所帮助。

您在其中一条评论中提到您希望在用户按下按钮时更改约束。您可以通过为约束创建一个出口来以更少的代码实现这一点。在文档大纲页面中找到约束,然后 CTRL + 拖动到 class 以创建约束的出口。然后您可以更轻松地更改代码中的常量。

@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
    }
}