Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 为什么两个按钮之间的距离为零而不是齐平?_Cocoa_Autolayout_Nsview - Fatal编程技术网

Cocoa 为什么两个按钮之间的距离为零而不是齐平?

Cocoa 为什么两个按钮之间的距离为零而不是齐平?,cocoa,autolayout,nsview,Cocoa,Autolayout,Nsview,我在许多地方读到过Cocoa AutoLayout中的约束作用于相关控件/视图的视觉边界,因此下面的内容令人困惑(2me): 在Xcode IB中,我将两个(按钮)按钮添加/拖动到视图中(一个在另一个下面),并约束它们,使它们之间的垂直距离为零。我希望有两个按钮在垂直方向上彼此齐平 结果是两个按钮之间有一个小的差异/空间,可以通过视觉或查看Xcode中的对齐矩形值进行验证。在本例中,它们之间的附加距离似乎为1点 下面是简单视图层次结构中约束的屏幕截图: 此外,确认上述情况,当您将约束中的常量

我在许多地方读到过Cocoa AutoLayout中的约束作用于相关控件/视图的视觉边界,因此下面的内容令人困惑(2me):

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

结果是两个按钮之间有一个小的差异/空间,可以通过视觉或查看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
属性

  • 渐变按钮位于齐平位置,按钮之间的约束为零
  • 纹理按钮之间似乎需要+1.0约束以避免重叠
  • 大多数其他按钮(尤其是圆形挡板样式的按钮)之间似乎需要-1.0的约束才能齐平
  • 修订问题(基于我的调查结果):

    以上是苹果有意为之(是否有一些逻辑/理性的解释)还是错误?
    如果以上是真的,那么用这些内置于视图布局中的“平滑”软糖来编写用户界面(类似于电子表格的网格)是否是一种糟糕的做法?

    视图如何根据其边界进行布局取决于视图本身


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

    您能向我们展示一下创建上述示例所使用的约束吗?问题用约束进行了修改。作为一个实验,您可以尝试将按钮的底部设置为自定义视图的顶部,该视图仅用纯色填充,同样,也可以将按钮的顶部设置为自定义视图的底部。自定义视图的对齐矩形将与其框架相同。这将验证,在约塞米蒂,一个按钮的对齐矩形根本不完全匹配其视觉范围,并明确指出“错误”发生在哪一侧。在Mavericks上,按钮和自定义视图之间没有空格。如果优胜美地上有漏洞,你可以把它当作一个漏洞来处理,或者只是接受苹果的意图。你所描述的行为是否与
    alignmentrectinests
    和/或其他相关方法有关。如果是这样的话,我是否应该覆盖上述方法,以通过AutoLayout实现所需的“刷新”行为?您可以这样做,但这需要子类化NSButton。此外,如果对齐插入有一些非零值,这是由于它如何绘制其内容,因此我建议不要更改它。我在代码中对
    NSButton
    进行了子类化,并且覆盖了
    alignmentrectinests
    ,这似乎允许按钮以齐平方式堆叠在另一个按钮之上。苹果已经将这个特定的对齐矩形插入的值硬编码为(2,3,2,2)-如果他们出错了怎么办?
            self.bezelStyle = NSBezelStyle.RoundedBezelStyle