繁体   English   中英

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

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

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

在此处输入图片说明 在此处输入图片说明

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

在此处输入图片说明 在此处输入图片说明

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

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

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

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

  • 首先让你的窗口比你需要的大
    • 使用您的布局,使其可能为600 x 600
  • 添加 UI 元素时仅添加垂直和前导约束(我们可以稍后将取消/复制按钮居中
    • 当然,我也指的是横向元素间约束
  • 对于包装多行标签(即“选择你想要的方式...”标签),给它一个特定的宽度约束
    • 285对您的布局来说是一个很好的价值……您可以稍后根据需要进行调整
  • 不要给出底部约束

你的 xib 现在看起来像这样(我把你的取消按钮保持在你拥有的>= 50 ):

在此处输入图片说明

现在,您可以调整垂直间距约束,而无需担心窗口框架的大小。

一旦您对布局感到满意,您只需要一个 Trailing 约束(在您的多行标签上)和一个底部约束(在 Cancel 按钮上)。

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

我提到的两个问题项目...您将“Matte thumbs...”和“Frame thumbs...”的 Content Hugging Priority 设置为250 这些都应该是默认值750

您的“取消/复制”按钮根据您当前的约束水平居中。 不过,我建议将它们放在 StackView 中,然后将该 StackView Top 约束到它上面的元素,将 Bottom 约束到 Superview ......然后水平居中。


编辑

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

首先,Interface Builder的是(大家都知道)一样的运行时输出。 它很接近,但肯定不完全相同。

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

iOS开发的一个完美例子:

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

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

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

我的标签是静态的(文本永远不会改变)或者我是否按照我想要的方式设置了约束都没有关系。 IB 将尽最大努力让我相信我需要改变。

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

我可能会在 IB 中布置一些东西来开始,并很好地了解我希望我的布局看起来如何,但随后我将所有这些都写在代码中以获得最终结果。

并不是说我说这种方法更好……很多时候当我对自己说“嘿,我可以拖放 UI 元素,添加约束和IBOutlet / IBAction连接,我已经完成了!”

不过,再次,只是我对这个话题的个人想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM