Storyboard共享约束常量

时间:2018-02-14 10:38:56

标签: ios autolayout uistoryboard ios-autolayout

有没有办法在故事板中的约束之间共享常量(或者更好地在全局中定义它们并在需要时使用)?

说,我希望距离顶部的距离等于左边的距离 - 这些是通过设置任何对称性无法实现的,我不想每次都改变它们,只需更换一个并看到结果。

我想要一个故事板(可点击)解决方案,无需编码。

2 个答案:

答案 0 :(得分:1)

嗯,您不能在故事板中使用已定义的常量,但可以共享属性。根据您的设计有多复杂,可能不值得麻烦。如果您只想在两个项目之间共享相同的距离,那么最好编辑它们的值。如果你有几个依赖关系,你可以创建" spacers"它们的大小相同。

这很简单,只需在故事板中添加两个或更多(隐藏)UIView个对象即可。选择一个作为主项目,然后将其他项目设置为具有该项目的大小属性。主设备可以设置为1:1的比例,因此您只需设置和更改它的高度即可在X和Y中调整所有设置的大小。然后将其他项目与这些对象对齐。

另请注意,乘数可以使用除1:1之外的其他值。

另一个注意事项:如果您只想定位一个视图,那么一个隐藏视图就足够了。

enter image description here

答案 1 :(得分:0)

没有更多信息很难说,但我认为最好的解决方案是将UIView子类化,类似这样:

SWIFT 4.0

class MySymmetricView {
    @IBInspectable var inset: Float = 10.0 // Put your constraints here, @IBInspectable will expose them to IB, you can also set your constants here

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupConstraints()
    }

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

    func setupConstraints() {
         NSLayoutConstraint(item: self, attribute: .leading, relatedBy: .equal, toItem: superview, attribute: .leadingMargin, multiplier: 1.0, constant: inset).isActive = true
         NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: superview, attribute: .leadingMargin, multiplier: 1.0, constant: inset).isActive = true
    }

}

或者以类似的方式对约束本身进行子类化。