为什么两个按钮限制在它们之间的ZERO距离,而不是齐平?

时间:2015-01-03 18:55:20

标签: cocoa autolayout nsview

我已经在很多地方读过Cocoa AutoLayout中的约束作用于所讨论的控件/视图的视觉界限,所以下面是令人困惑的(2me):

在Xcode IB中,我将两个(push button)按钮添加/拖动到视图(一个在另一个下面)并约束它们使得它们之间的垂直距离为零。我希望两个按钮在垂直方向上相互齐平。

结果是两个按钮在它们之间具有小的差异/空间,可以通过视觉验证或通过查看Xcode中的对齐矩形值来验证。在这种情况下,它们之间的额外距离似乎是1点。

taken in Xcode 6

下面是简单视图层次结构中约束的屏幕截图:

view hierarchy and constraints

此外,确认上述内容后,当您将约束中的常量更改为-1时,两个按钮会显示为彼此齐平。

buttons with vertical difference of -1.0

以上是OS X 10.10(Yosemite)。

奇怪的是,在我的实际应用中(以上只是SO问题的测试用例)当我垂直堆叠多个NSButton时(编程而不是IB)我需要提供-4.0之间的约束它们(与上面的-1.0相对)使它们齐平。此按钮的bezelStyle如下(Swift):

        self.bezelStyle = NSBezelStyle.RoundedBezelStyle

[虽然没有意义,但如果需要使它们均匀-1.0,我会更舒服!]

更新I:

我想我已经找到了为什么我的应用程序与测试示例的行为不同。我在代码中使用了NSBezelStyle.RoundedBezelStyle并将其高度设置为24.0;各种事情都指向这个按钮样式/类型需要有一个固定的高度(参见IB高度参数灰色并固定在21.0并且无法更改!)24和21之间的差异是3.0,这正是我们所看到的是主要应用约束的差异-4.0相对于其他例子要求-1.0

故事的寓意:不要在需要可变高度的某些使用场景之外使用RoundedBezelStyle! PostScript:RoundedRectBezelStyle似乎遭受了同样的弊病!

仍然存在这样的问题:为什么测试示例中的某些按钮不是齐平的,需要-1.0的约束......

更新II:

进一步测试表明,根据我选择的按钮的“类型”,我会得到不同的结果。在代码中,这将链接到按钮的bezelStyle属性。

  1. 渐变按钮与按钮
  2. 之间的零约束齐平
  3. 纹理按钮似乎需要在按钮之间需要+1.0约束以避免重叠
  4. 大多数其他按钮(特别是带有圆角边框样式的按钮)似乎需要在它们之间约束-1.0才能刷新
  5. 修订问题(根据我的发现):

    以上是故意的Apple(有一些逻辑/理性的解释)还是他们的错误? 如果上述情况属实,那么编写我的用户界面(类似电子表格的网格)以及如何布置我的视图的内置“齐平”的软件是不好的做法吗?

1 个答案:

答案 0 :(得分:1)

视图如何根据视图的界限来确定视图本身。

你所看到的是按钮的样式没有覆盖自动布局设置的整个框架。这是正确的行为。