使用 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.
旁边的框
我通过以下方式解决了这个问题:
- 打开您正在处理的 Storyboard 视图控制器。
- Select 你的
UITableView
.
- Select 视图控制器和 select 编辑器 > 解决自动布局问题 > Select 在 [ ] 视图控制器中编辑视图 > 添加缺少的约束 从菜单中:
- Select 您 table 视图中的所有约束:
- 从右窗格中选中以下复选框:占位符 - 在生成时删除:
现在您可以在代码中手动添加所有自动布局约束,而不会出现任何警告。
希望对你有所帮助。
您在其中一条评论中提到您希望在用户按下按钮时更改约束。您可以通过为约束创建一个出口来以更少的代码实现这一点。在文档大纲页面中找到约束,然后 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
}
}
我有一个带有 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.
旁边的框我通过以下方式解决了这个问题:
- 打开您正在处理的 Storyboard 视图控制器。
- Select 你的
UITableView
. - Select 视图控制器和 select 编辑器 > 解决自动布局问题 > Select 在 [ ] 视图控制器中编辑视图 > 添加缺少的约束 从菜单中:
- Select 您 table 视图中的所有约束:
- 从右窗格中选中以下复选框:占位符 - 在生成时删除:
现在您可以在代码中手动添加所有自动布局约束,而不会出现任何警告。
希望对你有所帮助。
您在其中一条评论中提到您希望在用户按下按钮时更改约束。您可以通过为约束创建一个出口来以更少的代码实现这一点。在文档大纲页面中找到约束,然后 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
}
}