Cocoa 为什么两个按钮之间的距离为零而不是齐平?
我在许多地方读到过Cocoa AutoLayout中的约束作用于相关控件/视图的视觉边界,因此下面的内容令人困惑(2me): 在Xcode IB中,我将两个(Cocoa 为什么两个按钮之间的距离为零而不是齐平?,cocoa,autolayout,nsview,Cocoa,Autolayout,Nsview,我在许多地方读到过Cocoa AutoLayout中的约束作用于相关控件/视图的视觉边界,因此下面的内容令人困惑(2me): 在Xcode IB中,我将两个(按钮)按钮添加/拖动到视图中(一个在另一个下面),并约束它们,使它们之间的垂直距离为零。我希望有两个按钮在垂直方向上彼此齐平 结果是两个按钮之间有一个小的差异/空间,可以通过视觉或查看Xcode中的对齐矩形值进行验证。在本例中,它们之间的附加距离似乎为1点 下面是简单视图层次结构中约束的屏幕截图: 此外,确认上述情况,当您将约束中的常量
按钮
)按钮添加/拖动到视图中(一个在另一个下面),并约束它们,使它们之间的垂直距离为零。我希望有两个按钮在垂直方向上彼此齐平
结果是两个按钮之间有一个小的差异/空间,可以通过视觉或查看Xcode中的对齐矩形值进行验证。在本例中,它们之间的附加距离似乎为1点
下面是简单视图层次结构中约束的屏幕截图:
此外,确认上述情况,当您将约束中的常量更改为-1时,两个按钮看起来彼此齐平
以上内容在OSX10.10(约塞米蒂)上
更奇怪的是,在我的实际应用程序中(以上只是SO问题的一个测试用例),当我垂直(以编程方式而不是通过IB)堆叠许多NSButton
时,我需要在它们之间提供一个-4.0的约束(与上面的-1.0相反),以使它们齐平。此按钮的边框样式如下(Swift):
[虽然这没有意义,但如果统一使用-1.0使它们齐平,我会感觉舒服得多!]
更新一:
我想我已经找到了为什么我的应用程序的行为与测试示例不同。我在代码中使用了NSBezelStyle.RoundedBezelStyle
,并将其高度设置为24.0;各种各样的东西都指向这个按钮样式/类型需要有一个固定的高度(参见IB,其中高度参数是灰色的,固定在21.0,不能更改!)24和21之间的差异是3.0,这正是我们所看到的主要应用程序约束的差异-4.0相对于rest示例所需的-1.0
这个故事的寓意是:不要在需要可变高度的特定使用场景之外使用RoundedBezelStyle
!附言:RoundedRectBezelStyle似乎也有同样的毛病
这仍然留下了一个问题,为什么测试示例中的某些按钮没有与要求的-1.0约束齐平
更新二:
进一步的测试表明,根据我选择的按钮的“类型”,我会得到不同的结果。在代码中,这将链接到按钮的bezelStyle
属性
如果以上是真的,那么用这些内置于视图布局中的“平滑”软糖来编写用户界面(类似于电子表格的网格)是否是一种糟糕的做法?视图如何根据其边界进行布局取决于视图本身
您看到的是按钮的样式没有覆盖自动布局设置的整个框架。这是正确的行为 您能向我们展示一下创建上述示例所使用的约束吗?问题用约束进行了修改。作为一个实验,您可以尝试将按钮的底部设置为自定义视图的顶部,该视图仅用纯色填充,同样,也可以将按钮的顶部设置为自定义视图的底部。自定义视图的对齐矩形将与其框架相同。这将验证,在约塞米蒂,一个按钮的对齐矩形根本不完全匹配其视觉范围,并明确指出“错误”发生在哪一侧。在Mavericks上,按钮和自定义视图之间没有空格。如果优胜美地上有漏洞,你可以把它当作一个漏洞来处理,或者只是接受苹果的意图。你所描述的行为是否与
alignmentrectinests
和/或其他相关方法有关。如果是这样的话,我是否应该覆盖上述方法,以通过AutoLayout实现所需的“刷新”行为?您可以这样做,但这需要子类化NSButton。此外,如果对齐插入有一些非零值,这是由于它如何绘制其内容,因此我建议不要更改它。我在代码中对NSButton
进行了子类化,并且覆盖了alignmentrectinests
,这似乎允许按钮以齐平方式堆叠在另一个按钮之上。苹果已经将这个特定的对齐矩形插入的值硬编码为(2,3,2,2)-如果他们出错了怎么办?
self.bezelStyle = NSBezelStyle.RoundedBezelStyle