【问题标题】:how can i get window's contentView to "hug" it's subViews我怎样才能让 Windows contentView “拥抱”它的子视图
【发布时间】:2012-05-12 00:46:05
【问题描述】:

this question,我有一个 NSView,它是 NSWindow 的 contentView,它包含几个垂直堆叠的子视图。其中一些是固定大小的,其中一些可以使用展开按钮展开或折叠。

我想实现一种“手风琴”效果,其中展开或折叠其中一个子视图会使其他所有内容相应地调整和调整超级视图和窗口的大小。

似乎应该能够通过使用自动布局设置正确的一组约束来实现这一点,而我现在可以很好地完成初始布局。但我不知道如何设置约束,以便超级视图自动调整大小以拥抱子视图。

上面链接的问题中的 OP 从来没有得到答案,并提供了他自己的解决方案,就像我开始独立实施的那个一样,但我想我会再次把它扔在那里,以防有任何自动布局专家知道一个窍门。似乎应该有一种方法可以通过利用自动布局让超级视图拥抱子视图,而无需手动计算子视图的大小并手动重置超级视图的大小。

有人知道吗?

【问题讨论】:

    标签: cocoa nsview nsviewcontroller autolayout


    【解决方案1】:

    自动布局既酷又全面。还有奥术。

    我很努力,但无法想出一套可以做我想做的事情的约束。在我看来,如果您在超级视图中垂直堆叠一些 NSView 并设置约束,以便将顶部子视图固定到超级视图的顶部并沿着子视图堆栈向下,您将每个子视图的顶部固定到底部边缘上面的一个,然后最后将最后一个子视图的底部边缘固定到超级视图的底部边缘,然后以编程方式调整一个或多个子视图的大小,它应该能够在超级视图的底部向上拉或向下推到让它拥抱它的子视图。

    除了最后一块外,一切都按预期进行。当您尝试将底部子视图固定到父视图的底部时,自动布局无法满足所有约束。似乎调整超级视图的大小以满足约束不在算法中。要么那个,要么我错过了一些其他需要设置的约束。

    当我谈到这个主题时,看着调试器,似乎在窗口的 contentView 和窗口框架之间存在不可设置的约束。我有点想知道,如果能够解决这些限制,是否可以让原始方案发挥作用。

    无论如何,我确实想出了一个使用自动布局的解决方案,它非常接近我希望自动布局能够做到的,因为所有必要的就是继承 NSView 并将几行代码放入intrinsicSize 方法,然后使用超级视图的子类。

    我在github 上创建了一个包含可折叠视图基类和整个工作演示的 xcode 项目。

    【讨论】:

      【解决方案2】:

      我可以确认,在像您这样的情况下,Xcode 自行安装的自动约束可能会破坏布局。例如,如果您的可变垂直视图没有明确的约束,IB 很可能会添加一个自动约束以使布局明确。稍后,当您尝试通过在其上安装另一个约束来更改该视图的大小时,您将收到自动布局错误。

      一种可能的解决方案(没有实现-intrinsicContentSize 和/或其他子类化)是在 IB 中寻找所有可能会干扰您的布局的自动约束,并尝试以较低优先级在它们的位置设置显式约束。不过,这并不总是有效。

      另一个残酷的解决方案是删除 -awakeFromNib 中的所有约束,然后只设置你需要的那些。当然,您可以尝试以编程方式仅删除那些阻碍您的约束,但这并不可靠,因为下次您更改 .xib 中的某些内容时,问题可能会在完全不同的地方再次出现。

      通常,我必须同时做一些工作才能让一切正常运行。

      【讨论】:

      • 我确实删除了 -awakeFromNib 中的所有约束,并以编程方式创建了我想要的约束。我仍然坚信,窗口框架和窗口 contentView 之间存在我/我们无法控制的约束,在这样的边缘情况下会让您感到困惑。无论如何,我在上面的答案中引用的 github 上的解决方案(使用子类 NSView,覆盖了 intrinsicContentSize)对我来说工作正常。
      • 我在窗口框架和内容视图之间遇到约束问题的唯一情况是当我为文本视图启用检查器栏时,但我想那是某种错误。我的配置与您的配置几乎相同(一种完全通过约束实现的垂直手风琴,我不必实现-intrinsicContentSize,但我确实必须处理优先级。
      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2013-08-25
      • 2019-05-25
      相关资源
      最近更新 更多