Как программно добавить Autolayout constraints
Используя классический способ
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
view.addConstraint(horizontalConstraint)
let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
view.addConstraint(verticalConstraint)
let widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 100)
newView.addConstraint(widthConstraint)
// view.addConstraint(widthConstraint) // работает аналогично
let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 100)
newView.addConstraint(heightConstraint)
// view.addConstraint(heightConstraint) // работает аналогично
}
Используя смешанный способ(Классический + Visual Format Language)
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
view.addConstraint(horizontalConstraint)
let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
view.addConstraint(verticalConstraint)
let views = ["newView": newView]
let widthConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
newView.addConstraints(widthConstraints)
// view.addConstraints(widthConstraints) // работает аналогично
let heightConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[newView(100)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
newView.addConstraints(heightConstraints)
// view.addConstraints(heightConstraints) // работает аналогично
}
Используя только Visual Format Language
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
let views = ["view": view, "newView": newView]
let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:[view]-(<=0)-[newView(100)]", options: NSLayoutFormatOptions.AlignAllCenterY, metrics: nil, views: views)
view.addConstraints(horizontalConstraints)
let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[view]-(<=0)-[newView(100)]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: views)
view.addConstraints(verticalConstraints)
}
Используя Autoresizing mask
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
newView.backgroundColor = UIColor.redColor()
newView.translatesAutoresizingMaskIntoConstraints = true
newView.center = CGPointMake(view.bounds.midX, view.bounds.midY)
newView.autoresizingMask = [UIViewAutoresizing.FlexibleLeftMargin, UIViewAutoresizing.FlexibleRightMargin, UIViewAutoresizing.FlexibleTopMargin, UIViewAutoresizing.FlexibleBottomMargin]
view.addSubview(newView)
}
Используя Anchor(только для iOS 9)
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
let vertivalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100)
let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100)
NSLayoutConstraint.activateConstraints([horizontalConstraint, vertivalConstraint, widthConstraint, heightConstraint])
}
Используя SnapKit(сторонее ПО)
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.redColor()
view.addSubview(newView)
newView.snp_makeConstraints { (make) -> Void in
make.centerX.equalTo(view)
make.centerY.equalTo(view)
make.width.equalTo(100)
make.height.equalTo(100)
}
}
В этом случае не требуется ни newView.translatesAutoresizingMaskIntoConstraints = false, ни активация constraints.
Используя Cartography(стороннее ПО)
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.redColor()
view.addSubview(newView)
constrain(newView, view) { (newView, view) -> () in
newView.centerX == view.centerX
newView.centerY == view.centerY
newView.width == 100
newView.height == 100
}
}
Данная библиотека использует декларативный стиль программирования, т.е она описывает каков объект, а не как его отображать.
P.S Представленный код работает для swift 2.