以编程方式向自定义组件添加约束

时间:2016-05-27 13:06:51

标签: swift autolayout constraints ios-autolayout

我正在通过继承默认组件在Swift中开发自定义组件。下面是我的一段代码:

class DirectionButton: UIButton {
    var backgroundImage: UIImageView!
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        styleComponent()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        styleComponent()
    }

    func styleComponent() {
        backgroundImage = UIImageView(image: UIImage(named: "seta-proximo"))
        backgroundImage.contentMode = .ScaleAspectFit
        self.setNeedsLayout()
        self.layoutIfNeeded()
        self.addSubview(backgroundImage)
        let imageConstraints = NSLayoutConstraint(item: self, attribute: .TrailingMargin, relatedBy: .Equal, toItem: self, attribute: .Trailing, multiplier: 1, constant: 10)
        backgroundImage.addConstraint(imageConstraints)
    }
}

backgroundImage变量需要距按钮右侧10个点,这就是我需要约束的原因。

运行后我得到了一个类似的异常:视图层次结构没有为约束做好准备。

如何正确添加约束?

3 个答案:

答案 0 :(得分:0)

<强>被修改

  1. 首先这样做:
  2.   

    backgroundImage.translatesAutoresizingMaskIntoConstraints = false

    1. 将约束添加到自我而非 backgroundImage
    2. 您正在从自我添加约束自我(不正确)从 backroundImage 添加到自我
    3. 约束条件不完整。您只添加一个尾随约束。
    4. 整体解决方案是:

      {{1}}

      结果输出就是这个。您可以根据自己的意愿修改常量值

      enter image description here

      在这种情况下,绿色是按钮,红色是背景图像。

      试试这个,如果您仍然收到任何警告或并发症,请告诉我。

答案 1 :(得分:0)

阅读文档,我按照提示使用布局锚点@AjayBeniwal建议。我需要的代码如下(在我将子视图添加到按钮后):

backgroundImage.trailingAnchor.constraintEqualToAnchor(self.layoutMarginsGuide.trailingAnchor, constant: -10).active = true
backgroundImage.bottomAnchor.constraintEqualToAnchor(self.layoutMarginsGuide.bottomAnchor).active = true
backgroundImage.centerYAnchor.constraintEqualToAnchor(self.layoutMarginsGuide.centerYAnchor).active = true

这样,图像垂直集中在距离右边缘20个点的按钮上。

答案 2 :(得分:0)

//为ImageView提供Constrain Outlet

http -> https