代码中设置的自动布局约束未出现在界面生成器中

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

一切都很好。

【讨论】:

以上是关于代码中设置的自动布局约束未出现在界面生成器中的主要内容,如果未能解决你的问题,请参考以下文章

自动布局、约束和旋转

使用自动布局 Xcode 居中

自动布局混合代码和界面生成器

iOS UIScrollView 的宽度与约束中设置的宽度不同

以编程方式添加约束会破坏自动布局约束

界面生成器中的自动布局