[英]iOS adding constraints programmatically in Swift
So, I'm done using the IB
in Xcode
and want to write all UI
in Swift. 因此,我已经在Xcode
使用了IB
,并且想要在Swift中编写所有UI
。
So what I've done is: 所以我要做的是:
UIView
to contain the elements i want to write - lets call it "TestView" 创建了一个新的UIView
来包含我要编写的元素-称之为“ TestView” TestView
to a VC
as a sub view. 我已经将TestView
作为子视图添加到了VC
。 In the TestView
class I've added the elements like this: 在TestView
类中,我添加了以下元素:
class TestView: UIView { var someLabel:UILabel! override init(frame: CGRect) { super.init(frame: frame) self.someLabel = UILabel(frame: CGRect(x: self.frame.midX, y: oneSixthHeight, width: 100, height: 22)) self.someLabel.text = "test" var constraints:[NSLayoutConstraint] = [] self.someLabel.translatesAutoresizingMaskIntoConstraints = false let rightsideAnchor:NSLayoutConstraint = NSLayoutConstraint(item: self.someLabel, attribute: .Trailing, relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: 1, constant: 1) constraints.append(rightsideAnchor) NSLayoutConstraint.activateConstraints(constraints) } }
With this I expect the UILabel
to be anchored to the right side of the view. 这样,我希望UILabel
可以锚定到视图的右侧。
However, I do get this error: 但是,我确实收到此错误:
Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with items > and > because they have no common ancestor. 由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“无法激活具有>和>的约束,因为它们没有共同的祖先。
Does the constraint reference items in different view hierarchies? 约束是否引用了不同视图层次结构中的项目? That's illegal.' 那是非法的。
What am I doing wrong? 我究竟做错了什么?
You should add constraints only after view is added to the view hierarchy. 仅在将视图添加到视图层次结构后,才应添加约束。 From your code it is clear that you have not added the UILabel instance to view. 从代码中可以明显看出,您尚未添加要查看的UILabel实例。
Updated for Swift 3 为Swift 3更新
import UIKit
class ViewController: UIViewController {
let redView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .red
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupAutoLayout()
}
func setupViews() {
view.backgroundColor = .white
view.addSubview(redView)
}
func setupAutoLayout() {
// Available from iOS 9 commonly known as Anchoring System for AutoLayout...
redView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
redView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true
redView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
redView.heightAnchor.constraint(equalToConstant: 300).isActive = true
// You can also modified above last two lines as follows by commenting above & uncommenting below lines...
// redView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
// redView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
}
Type of Constraints: 约束类型:
/*
// regular use
1.leftAnchor
2.rightAnchor
3.topAnchor
// intermediate use
4.widthAnchor
5.heightAnchor
6.bottomAnchor
7.centerXAnchor
8.centerYAnchor
// rare use
9.leadingAnchor
10.trailingAnchor
etc. (note: very project to project)
*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.