【发布时间】:2016-03-22 23:14:33
【问题描述】:
我在界面生成器中设置了一个自定义视图,具有顶部、前导、尾随、高度约束。
在我的自定义视图中,我有一个标题和一个按钮。 我试图在标题中添加一个底部和中心约束。 以及按钮的宽度、高度、底部、前导约束。
当我添加任何约束时,我会在界面生成器中收到警告:
预期:宽度=600,高度=68。
实际:宽度=0,高度=0
当我运行代码时,一切正常,但我在界面生成器中看不到任何内容。
代码:
@IBDesignable
class UIHeader: UIView {
var delegate: HeaderDelegate?
private lazy var titleLable: UILabel = {
let lbl = UILabel()
lbl.translatesAutoresizingMaskIntoConstraints = false
lbl.font = UIFont(name: "Lato-Light", size: 16)
lbl.text = "Title"
return lbl
}()
private lazy var backButton: UIButton = {
let btn = UIButton()
btn.tintColor = UIColor.lightGrayColor()
btn.translatesAutoresizingMaskIntoConstraints = false
let image = UIImage(named: "prev")
if let image = image {
btn.setImage(image.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal)
}
btn.addTarget(self, action: #selector(UIHeader.OnBackButtonClickLister(_:)), forControlEvents: .TouchUpInside)
return btn
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
}
extension UIHeader {
@IBInspectable
var backButtonImage: UIImage? {
get {
return backButton.imageForState(.Normal)
}
set (newImage) {
backButton.setImage(newImage?.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal)
}
}
@IBInspectable
var title: String? {
get {
return titleLable.text
}
set (newTitle) {
titleLable.text = newTitle
}
}
}
extension UIHeader {
private func setupView() {
backgroundColor = UIColor.whiteColor()
translatesAutoresizingMaskIntoConstraints = false
addSubview(titleLable)
addSubview(backButton)
//add shadow
layer.shadowColor = UIColor(white: 115/255, alpha: 1.0).CGColor
layer.shadowOpacity = 0.5
layer.shadowRadius = 8
layer.shadowOffset = CGSizeMake(0, -1)
NSLayoutConstraint.activateConstraints([
//Title//
//center x
NSLayoutConstraint(item: titleLable, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1.0, constant: 0),
//bottom
NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: titleLable, attribute: .Bottom, multiplier: 1, constant: 12),
//button//
//bottom
NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: backButton, attribute: .Bottom, multiplier: 1, constant: 4),
//leading
NSLayoutConstraint(item: backButton, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1, constant: 0),
//width
NSLayoutConstraint(item: backButton, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .Width, multiplier: 1, constant: 40),
//height
NSLayoutConstraint(item: backButton, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1, constant: 40)
])
}
}
我还尝试使用以下方法添加约束:
addConstraint(NSLayoutConstraint)
不知道是什么问题。
谢谢
【问题讨论】:
-
我认为问题在于您试图在布局发生之前在
init中执行此操作。 -
@Michael,你是什么意思?我在哪里做这个?
-
您的
init调用setupView()创建新约束,这些约束依赖于尚未设置的现有UI 属性,因为尚未发生布局。我只是怀疑这是警告的来源。您可以尝试拨打layoutSubviews来查看警告是否消失。 -
我正在使用来自raywenderlich.com/117757/… 的教程,但我会尝试一下,看看会发生什么,谢谢
-
我每天都会相信他们而不是我的理论。我没有订阅,所以我看不到那个——它多大了?也许它可能已经过时了?
标签: swift uiview autolayout nslayoutconstraint