代码中设置的自动布局约束未出现在界面生成器中
Posted
技术标签:
【中文标题】代码中设置的自动布局约束未出现在界面生成器中【英文标题】:Autolayout constraints set in code not appearing in interface builder 【发布时间】: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/… 的教程,但我会尝试一下,看看会发生什么,谢谢
我每天都会相信他们而不是我的理论。我没有订阅,所以我看不到那个——它多大了?也许它可能已经过时了?
【参考方案1】:
我删除了
translatesAutoresizingMaskIntoConstraints = false
一切都很好。
【讨论】:
以上是关于代码中设置的自动布局约束未出现在界面生成器中的主要内容,如果未能解决你的问题,请参考以下文章