当我更改自动布局约束时,为什么我的 NSWindow 不调整大小?

Why doesn't my NSWindow resize when I change auto layout constraints?

我想我已经对 Interface Builder 中的自动布局如何工作有了一个不错的理解 (ha)。我有一个 .xib,上面写着“没有自动布局问题”。这是它的两个屏幕截图,没有选择任何内容,也有选择的内容,因此您可以了解工作中的限制:

例如,现在我想减小“总缩略图大小:”标签和“使用 TIFF”单选按钮矩阵之间的垂直间距。所以我点击一些东西来选择那个约束,然后我编辑它的“常量”值以将它从 47 更改为,比如说,30。当我这样做时,我希望 window 会垂直收缩17、让所有的约束继续被遵守。相反,它移动了“大小和格式”标签的垂直位置,这样做打破了它的垂直限制,然后抱怨涉及一堆项目的“内容优先级歧义”;以下是该状态的屏幕截图,显示了优先级歧义:

它要我更改垂直压缩阻力优先级 and/or 垂直拥抱优先级以允许它 compress/expand 远离其固有尺寸的东西;但我不想那样做。我希望所有这些项目都保留其固有大小,并且我希望 window 调整大小。我可以将 window 手动调整为 -17,并将各种项目移动到适当的位置,然后再次显示“无自动布局问题”;因此,除了出于某种原因它拒绝按应有的方式调整 window 的大小外,这种情况确实没有什么困难或模棱两可的。所以,我的问题是:我如何避免它这样做,让它自己调整 window 的大小并正确移动东西?我不明白为什么这么混乱;在我看来,从 window 的顶部到底部有一个清晰明确的垂直约束链,更改其中一个约束应该只是强制 window 调整大小。我尝试过使用“更新帧”,但它似乎没有帮助。

我想我已经在约束更改之前将 .xib 文件上传到我的 Dropbox:https://www.dropbox.com/s/vp90s1fh692i8pi/CopyThumbs.xib

我抓住了你的 xib 并尝试了一些东西...我只能找到 两个 项会导致问题。

但首先,一些提示(根据我的经验):

  • 首先让您的 window 比您需要的更大
    • 根据您的布局,可能 600 x 600
  • 添加 UI 元素时,仅添加垂直和前导约束(稍后我们可以将 Cancel/Copy 按钮居中
    • 当然,我也是指Horizo​​ntal inter-element constraints
  • 为了包装多行标签(即你的 “选择你想要的方式...” 标签),给它一个特定的宽度约束
    • 285 对您的布局来说是一个很好的价值...您可以稍后根据需要进行调整
  • 还没有给出底部约束

你的 xib 现在看起来像这样(我把你的“取消”按钮保留在前面 >= 50):

现在您可以调整垂直间距限制,而无需担心 window 帧大小。

一旦您对布局感到满意,您只需要一个 Trailing 约束(在您的多行标签上)和一个 Bottom 约束(在“取消”按钮上)。

添加这些约束,您的 window 框架 应该 自行调整大小。如果没有,选择“更新帧”应该可以修复它。

我提到的两个问题项目...您将“遮罩缩略图...”和“框架缩略图...”的内容拥抱优先级设置为 250。它们都应该是默认值 750.

你的 Cancel/Copy 按钮 应该 水平居中,与你当前的约束。不过,我建议将它们放在 StackView 中,然后将 StackView Top 约束到它上面的元素,将 Bottom 约束到 Superview...然后水平居中。


编辑

注意:我不为 Apple 工作...这些评论只是我的轶事观察。

首先,Interface Builder(众所周知)与运行-时间输出相同。很接近,但肯定不完全相同。

其次,IB 做了很多假设 -- 同时,它不知道我们接下来要做什么。

来自 iOS 开发的完美示例:

如果在 IB 中,我将 UIScrollView 添加到视图 而没有向其中添加任何内容 ,IB 将无休止地抱怨 Content Size Ambiguity.. . 甚至不会定位视图来反映约束。

那是因为 IB 不知道我将在 运行 时间添加子视图(具有适当的约束)。摆脱红色“错误”消息的唯一方法是在 IB 中添加一个子视图,然后我必须在 运行 时间(呃)立即删除它。

IB 也倾向于抱怨/警告“固定宽度约束可能导致剪裁”,并且,正如您遇到的那样,“本地化问题:缺少尾随约束”。

无论我的标签是静态的(文本永远不会改变)还是我的约束设置完全符合我的要求,都没有关系。 IB 将尝试其最大胆地说服我,我需要改变一些事情。

这是许多人不再使用故事板/XIB 的原因之一。对于我的工作,我们不使用任何 XIB,我们唯一使用的 Storyboard 是 LaunchScreen (iOS)。

我可能会先在 IB 中进行布局,以便更好地了解我希望我的布局看起来如何,但随后我将所有内容都写在代码中以获得最终结果。

并不是说我说这种方法更好......很多时候我都在想“嘿,我可以 drag/drop UI 元素,添加约束和 IBOutlet / IBAction 连接,我已经完成了!"

不过,再次强调一下我对这个话题的个人看法。