【问题标题】:NSLayoutConstraint constraintWithItem... orderingNSLayoutConstraint constraintWithItem... 排序
【发布时间】:2015-05-05 18:26:15
【问题描述】:

每当我通过+constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: 创建NSLayoutConstraint 时,我似乎总是以错误的顺序放置项目,然后我不得不将它们颠倒过来。这太烦人了,在实际运行代码之前,我似乎无法弄清楚它会如何运行。例如,我希望这段代码将view 定位在self.view 前沿的右侧16 个点,这对我来说是直观的,因为参数的顺序是:

NSLayoutConstraint *leadingMarginConstraint = [NSLayoutConstraint constraintWithItem:self.view
                                                                           attribute:NSLayoutAttributeLeading
                                                                           relatedBy:NSLayoutRelationEqual
                                                                              toItem:view
                                                                           attribute:NSLayoutAttributeLeading
                                                                          multiplier:1
                                                                            constant:16];

但是,情况正好相反。 view 的前沿距离self.view 的前沿左侧 16 个点。与此相同:

NSLayoutConstraint *verticalSpacingConstraint = [NSLayoutConstraint constraintWithItem:view1
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:view2
                                                          attribute:NSLayoutAttributeTop
                                                         multiplier:1
                                                           constant:16];

我预计view2 的顶部比view1 的底部低 16 个点,但情况正好相反。 view2 的顶部比 view1 的底部高 16 点。

谁能向我解释这是如何工作的?参数顺序的意义是什么?

谢谢!

【问题讨论】:

    标签: ios uikit autolayout nslayoutconstraint


    【解决方案1】:

    Apple 的编程指南提供了答案: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html#//apple_ref/doc/uid/TP40010853-CH14-SW1

    具体来说,约束表示这个方程:y = m*x + b。

    其中“x”和“y”是视图属性,“b”是常数,“m”是乘数。 'x' 和 'y' 分别映射到您正在调用的方法中的第一项和第二项。所以如果 y 代表视图 2 的顶部,x 将是视图 2 的高度 + 16。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您必须查看定义约束的方程式。对于您的第一个示例,您要说的是,

      self.view.leading = view.leading x 1 + 16
      

      self.view.leading 必须为 0(根据定义),因此要使该等式起作用,视图的前沿需要为 -16。

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多