Ios 自动布局-使用NSLAYUTATTRIBUTECENTERX时,倍增器使用什么比例?

Ios 自动布局-使用NSLAYUTATTRIBUTECENTERX时,倍增器使用什么比例?,ios,autolayout,ios-autolayout,Ios,Autolayout,Ios Autolayout,使用nsLayoutAttributeCenter属性时,乘数为1会产生与参考视图匹配的中心。增大该值会将其向左移动,减小值(接近0)会将其向右移动 通过使用2.5、1和0.625的乘数,我已经能够通过反复试验(在超级视图中均匀分布3个视图)大致获得我想要的结果。在混乱中,我发现200集中在参考视图的左边缘(增加的幅度也超过了这一点,但不会移动视图),0.5集中在右边缘(朝着0减小会使视图进一步向左移动) 下面是我的问题: 这是什么 有没有一个公式可以用来准确地以这种方式放置视图,还是将永远是

使用
nsLayoutAttributeCenter
属性时,乘数为1会产生与参考视图匹配的中心。增大该值会将其向左移动,减小值(接近0)会将其向右移动

通过使用2.5、1和0.625的乘数,我已经能够通过反复试验(在超级视图中均匀分布3个视图)大致获得我想要的结果。在混乱中,我发现200集中在参考视图的左边缘(增加的幅度也超过了这一点,但不会移动视图),0.5集中在右边缘(朝着0减小会使视图进一步向左移动)

下面是我的问题:

  • 这是什么
  • 有没有一个公式可以用来准确地以这种方式放置视图,还是将永远是反复试验
  • 他们为什么要这样做

  • 当乘数不是1.0时,计算中心约束意味着什么是棘手的。我在Xcode 6中做了一些实验,下面是我的结论

    所讨论的约束的形式为
    A.center.x=B.center.x*m+c
    ,其中
    A
    B
    是涉及的视图,
    m
    是约束的乘数,
    c
    是约束的常数

    让我们假设B的
    center.x
    由一些其他约束固定。那么我相信autolayout的行为就好像它使用了这个算法一样:

  • 找到A和B最近的共同祖先视图。将此共同祖先称为G

  • 设bxg=B.x.在G坐标系中居中。您可以在代码中将其计算为
    CGFloat bxg=[G convertPoint:B.center fromView:B.superview].x

  • 在G坐标系中计算axg=A所需的x中心<代码>CGFloat axg=bxg*m+c

  • 将axg转换为
    A.superview
    的坐标系,并将其存储为
    A.center.x

  • 好的,既然如此,我们如何使用中心约束来实现“等间距视图”的目标?我们没有

    问题出在这里。假设所有三个子视图都具有相同的宽度w。(如果宽度不同,问题就更难了。)假设容器视图的宽度为W。有四个边距(一个在最左侧子视图的左侧,一个在左侧子视图和中间子视图之间,一个在中间子视图和右侧子视图之间,一个在右侧子视图的右侧。)

    因此,边距的宽度应为(W-3W)/4。然后我们想以某种方式将其插入到另一个约束中。你想使用一个中心约束,但为了简单起见,让我们考虑左边缘约束在最左边的视图L。我们希望约束为L.Leave=(W - 3 W)/ 4。此约束太复杂,autolayout无法直接处理。自动布局约束只能涉及两个视图属性,但这涉及三个

    解决方案是引入间隔视图。让我们从三个子视图开始:

    我已经将这三个子视图中的每一个子视图都限制为80x80并垂直居中

    现在,我将添加四个间隔视图,以灰色显示:

    我已经约束了每个间隔的高度和垂直中心,但是我没有约束它们的宽度。我接下来要做的是约束所有垫片具有相等的宽度:

    然后,我将把每个间隔片的前缘和后缘固定到其最近的邻居,手动将常数设置为零。我是这样做的第一个间隔:

    我对其他三个垫片也这样做。我不会在这里展示

    当我选择视图控制器并要求Xcode更新所有帧时,我得到的是均匀分布的视图:

    因为我实际上不希望间隔符在运行时可见,所以我将选择它们并将它们设置为隐藏隐藏视图仍参与布局。

    现在,如果子视图的宽度不都相同怎么办?让我们更改蓝色子视图的宽度:


    “自动布局”会更新帧,以便间隔符继续具有相同的宽度。

    我发现,如果将视图与superview中心X对齐(我相信Y轴也是如此),则可以使用以下公式计算预期视图中心的倍增系数:

    Coeff = superview.width / view.center.X * 0.5
    
    也就是说,如果superview的宽度为600,则需要将视图的中心放置在superview宽度的0.25上,然后视图的中心=150

    Coeff = 600 / 150 * 0.5 = 2
    
    如果您需要对称视图,那么

    Coeff = 600 / 450 *0.5 = 0.666
    
    因此,如果您知道视图中心(CoV)为0.25,则公式为:

    Coeff = 1 / CoV * 0.5
    

    比例基于视图的中心位置。因此,在iPhone5上,centerX(控制器的self.view)的值为160(纵向)。如果我试图均匀地隔开几个视图,我不会使用中心约束。关于这个概念的优秀迷你教程。谢谢感谢您回答这个问题,并再次感谢您回答了问题的根源。:)不确定这是否有助于解决我目前的问题,但无论如何,这都是值得学习的好东西。谢谢