Swift 以编程方式向标签添加约束
Swift programmatically adding constraints to labels
我在 for index 循环中并根据每个索引项添加标签。因为我以编程方式添加这些标签,所以我不知道如何将它们限制在设备宽度的最右侧。我在下面解释了我认为约束是如何起作用的。
我的目标 = 尾随 space 到超级视图(或包含视图)常量设置为 8.
let y_align = 340 * index + 70
let x_align = self.deviceWidth - 110
var derp = UILabel(frame: CGRectMake(0, 0, 200, 21))
derp.center = CGPointMake(CGFloat(x_align), CGFloat(y_align))
derp.textAlignment = NSTextAlignment.Right
derp.text = json["things"][index]["thing"].string!
self.some_view_container.addSubview(derp)
//now this is what I understand about constraints
let xconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.Trailing, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
toItem: some_view_container, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.Right, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: 8 //-- regular constant
)
derp.addConstraint(xconstraint)
这就是我想要的人情
- item: 我想约束 derp,它是 json
的值
- 属性:我想限制它的尾部 space 以便它一直向右推
- relatedBy:这里不知道,我不在乎它是否与任何东西相关,因为我只想要尾随 space 到 superview
- toItem:我想将它推到超级视图的右侧或者它的容器是 some_view_container
- attribute:这里没概念,我不关心视图容器的attribute
- 乘数:我只想要常量的个数,所以乘以 1
- 常量:我希望尾部 space 距离边缘
8
您可以使用此代码作为参考:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
addLabels()
}
func addLabels(){
let deviceWidth = UIScreen.mainScreen().bounds.width
//Here recopilate the constranins for later activation
var constraints = [NSLayoutConstraint]()
//Here I'm assuming that there are 5 labels
for index in 0..<5 {
//adjust this to spaciate labels
let y_align = CGFloat(20 * index + 70)
let x_align = deviceWidth - 110
var derp = UILabel(frame: CGRectMake(0, 0, 200, 21))
derp.center = CGPointMake(CGFloat(x_align), CGFloat(y_align))
derp.textAlignment = NSTextAlignment.Right
derp.text = "things \(index)"
let xconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.Trailing, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.Right, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: -8 //-- (Take a look here, its a minus)
)
let yconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.Top, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.TopMargin, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: y_align //-- regular constant
)
//recopilate constraints created here
constraints.append(xconstraint)
constraints.append(yconstraint)
derp.setTranslatesAutoresizingMaskIntoConstraints(false)
//add them to the desired control
self.view.addSubview(derp)
}
//This will tell iOS to use your constraint
NSLayoutConstraint.activateConstraints(constraints)
}
}
对于 swift 3.0
func addLabels(){
let deviceWidth = UIScreen.main.bounds.width
//Here recopilate the constranins for later activation
var constraints = [NSLayoutConstraint]()
//Here I'm assuming that there are 5 labels
for index in 0..<5 {
//adjust this to spaciate labels
let y_align = CGFloat(20 * index + 70)
let x_align = deviceWidth - 110
var derp = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
derp.center = CGPoint(x:CGFloat(x_align), y:CGFloat(y_align))
derp.textAlignment = NSTextAlignment.right
derp.text = "things \(index)"
let xconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.trailing, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.right, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: -8 //-- (Take a look here, its a minus)
)
let yconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.top, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.topMargin, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: y_align //-- regular constant
)
//recopilate constraints created here
constraints.append(xconstraint)
constraints.append(yconstraint)
derp.translatesAutoresizingMaskIntoConstraints = false
//add them to the desired control
self.view.addSubview(derp)
}
//This will tell iOS to use your constraint
NSLayoutConstraint.activate(constraints)
}
我在 for index 循环中并根据每个索引项添加标签。因为我以编程方式添加这些标签,所以我不知道如何将它们限制在设备宽度的最右侧。我在下面解释了我认为约束是如何起作用的。 我的目标 = 尾随 space 到超级视图(或包含视图)常量设置为 8.
let y_align = 340 * index + 70
let x_align = self.deviceWidth - 110
var derp = UILabel(frame: CGRectMake(0, 0, 200, 21))
derp.center = CGPointMake(CGFloat(x_align), CGFloat(y_align))
derp.textAlignment = NSTextAlignment.Right
derp.text = json["things"][index]["thing"].string!
self.some_view_container.addSubview(derp)
//now this is what I understand about constraints
let xconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.Trailing, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
toItem: some_view_container, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.Right, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: 8 //-- regular constant
)
derp.addConstraint(xconstraint)
这就是我想要的人情
- item: 我想约束 derp,它是 json 的值
- 属性:我想限制它的尾部 space 以便它一直向右推
- relatedBy:这里不知道,我不在乎它是否与任何东西相关,因为我只想要尾随 space 到 superview
- toItem:我想将它推到超级视图的右侧或者它的容器是 some_view_container
- attribute:这里没概念,我不关心视图容器的attribute
- 乘数:我只想要常量的个数,所以乘以 1
- 常量:我希望尾部 space 距离边缘 8
您可以使用此代码作为参考:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
addLabels()
}
func addLabels(){
let deviceWidth = UIScreen.mainScreen().bounds.width
//Here recopilate the constranins for later activation
var constraints = [NSLayoutConstraint]()
//Here I'm assuming that there are 5 labels
for index in 0..<5 {
//adjust this to spaciate labels
let y_align = CGFloat(20 * index + 70)
let x_align = deviceWidth - 110
var derp = UILabel(frame: CGRectMake(0, 0, 200, 21))
derp.center = CGPointMake(CGFloat(x_align), CGFloat(y_align))
derp.textAlignment = NSTextAlignment.Right
derp.text = "things \(index)"
let xconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.Trailing, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.Right, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: -8 //-- (Take a look here, its a minus)
)
let yconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.Top, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.TopMargin, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: y_align //-- regular constant
)
//recopilate constraints created here
constraints.append(xconstraint)
constraints.append(yconstraint)
derp.setTranslatesAutoresizingMaskIntoConstraints(false)
//add them to the desired control
self.view.addSubview(derp)
}
//This will tell iOS to use your constraint
NSLayoutConstraint.activateConstraints(constraints)
}
}
对于 swift 3.0
func addLabels(){
let deviceWidth = UIScreen.main.bounds.width
//Here recopilate the constranins for later activation
var constraints = [NSLayoutConstraint]()
//Here I'm assuming that there are 5 labels
for index in 0..<5 {
//adjust this to spaciate labels
let y_align = CGFloat(20 * index + 70)
let x_align = deviceWidth - 110
var derp = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
derp.center = CGPoint(x:CGFloat(x_align), y:CGFloat(y_align))
derp.textAlignment = NSTextAlignment.right
derp.text = "things \(index)"
let xconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.trailing, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.right, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: -8 //-- (Take a look here, its a minus)
)
let yconstraint = NSLayoutConstraint(
item: derp, //-- the object that we want to constrain
attribute: NSLayoutAttribute.top, //-- the attribute of the object we want to constrain
relatedBy: NSLayoutRelation.equal, //-- how we want to relate THIS object to A DIFF object
toItem: self.view, //-- this is the different object we want to constrain to
attribute: NSLayoutAttribute.topMargin, //-- the attribute of the different object
multiplier: 1, //-- multiplier
constant: y_align //-- regular constant
)
//recopilate constraints created here
constraints.append(xconstraint)
constraints.append(yconstraint)
derp.translatesAutoresizingMaskIntoConstraints = false
//add them to the desired control
self.view.addSubview(derp)
}
//This will tell iOS to use your constraint
NSLayoutConstraint.activate(constraints)
}