Swift程式碼動態建立NSLayoutConstraint佈局
阿新 • • 發佈:2019-01-10
示例效果
說明
黃色lable為子view(childView),紅色view為父view(parentView)。兩者關係為:
childView在距離父控制元件的左右各20邊距處, 高度25。chidView在parentView中垂直方向上居中顯示。
注:
約束的設定,控制元件內部約束由自己新增,比如寬高,如果是與其他的
控制元件約束那麼有父控制元件新增
NSLayoutConstraint引數說明:
/**
* 建立約束 NSLayoutConstraint 引數 說明:
* item 自己
* attribute
* relatedBy 大於等於 小於等於 等於 ...
* toItem 另外一個控制元件
* attribute 另一個控制元件的屬性
* multiplier 乘以多少
* constant : 加上多少
* NSLayoutConstraint : 某個控制元件的屬性值 等於 另外一個控制元件的屬性值
乘以多少 加上多少
* 新增約束 addConstraint
*/
NSLayoutConstraint(item view1: Any, attribute attr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem view2: Any?, attribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat)
建立子控制元件
let childView = UILabel()
childView.text = "正在連結伺服器"
childView.backgroundColor = UIColor.yellow //背影黃色
childView.textAlignment = .center //文字居中對齊
parentView.backgroundColor = UIColor.red//設定父元素背影紅色,方便檢視效果
關閉autoresizing
// 關閉autoresizing,不然無效果
childView.translatesAutoresizingMaskIntoConstraints =false
建立約束:
//建立相對父view的左右間距各20
//在約束
let leftConstraint = NSLayoutConstraint(item: childView, attribute : NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: topStatusBarView, attribute:NSLayoutAttribute.leading, multiplier: 1.0, constant: 20)
//右約束
let rightConstraint = NSLayoutConstraint(item: childView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: topStatusBarView, attribute:NSLayoutAttribute.trailing, multiplier: 1.0, constant: -20)
let centerConstraint = NSLayoutConstraint(item: childView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: topStatusBarView, attribute:NSLayoutAttribute.centerY, multiplier: 1.0, constant: 0)
//子控制元件自身高度
let heigtConstraint = NSLayoutConstraint(item: childView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute:NSLayoutAttribute.notAnAttribute, multiplier: 1.0, constant: 25)
//子控制元件內部自己的屬性(高度,自己新增)
childView.addConstraint(heigtConstraint)
//子元素相對父親的元素,由父新增
parentView.addConstraints([leftConstraint, rightConstraint, centerConstraint])