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

ste*_*CDP 2 uitableview ios nslayoutconstraint 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
}
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

kei*_*ter 6

您在其中一条评论中提到要在用户按下按钮时更改约束.您可以通过设置约束的出口来减少代码.在文档大纲页面中找到约束,然后按CTRL +拖动到您的类以创建约束的出口.然后,您可以更轻松地更改代码中的常量.

@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
    }
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*ler 5

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])
}
Run Code Online (Sandbox Code Playgroud)

更新:

NSIBPrototypingLayoutConstraint您正在运行的约束(以及引起异常)由Interface Builder自动生成,以使您的Storyboard或XIB视图布局不明确.这样做非常狡猾,但它会自动添加所需的最小约束,以便完全指定每个模糊视图的位置和大小.

解决此问题的方法是在Interface Builder中添加所需的最小约束,以便完全指定每个视图的位置和大小,然后选择每个不需要的约束,转到右侧边栏属性检查器,并选中Placeholder旁边的框- 在构建时删除.

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

  1. 打开您正在处理的Storyboard视图控制器.
  2. 选择你的UITableView.
  3. 选择视图控制器,然后从菜单中的[] View Controller> Add Missing Constraints中选择Editor> Resolve Auto Layout Issues> Selected View:

在此输入图像描述

  1. 从表视图中选择所有约束:

在此输入图像描述

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

在此输入图像描述

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

我希望这对你有帮助.