2012-05-02 17 views
1

this question,我有一个的NSView这是内容查看了一个NSWindow,它包含垂直堆叠在另一个之上的几个子视图。其中一些是固定大小,其中一些可以通过泄露按钮进行扩展或折叠。我怎样才能得到窗口的内容查看到“拥抱”这是子视图

我想实现一种“手风琴”效应展开或折叠子视图的人让一切调整并调整了上海华和相应的窗口,在其中。

它真的好像一个人应该能够通过建立一套正确使用自动布局约束来实现这一点,我必须现在做的初始布局罚款。但我不知道如何设置约束,以便超级视图自动调整大小以拥抱子视图。

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

有人知道吗?

回答

2

Autolayout很酷且全面。和奥术。

我努力,但未能拿出一套会做什么,我想做的约束。在我看来,如果你将一些NSView垂直堆放在一个超级视图中,并设置约束条件,使得顶级子视图被固定到超级视图的顶部,并沿着子视图堆叠,将每个顶部固定到底部边缘上面的那个,然后最后你将最后一个子视图的底部边缘固定到超级视图的底部边缘,然后以编程方式调整一个或多个子视图的大小,它应该能够拉下或向下按压超级视图的底部保持它的子视图。

除了最后一部分,一切都按预期工作。当您尝试将底部子视图固定到超级视图的底部时,自动布局无法满足所有约束。似乎调整超级视图以满足约束不在算法中。无论是或者我缺少一些需要设置的其他约束。

而且,当我关于这个问题,看着调试器,它似乎有未设定约束在一个窗口的内容查看和窗框之间的间隙。我有点怀疑能否扼制这些限制会让原来的计划奏效。

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

我创造出了我的看法可折叠的基类的Xcode项目和整个事情上github一个工作演示。

0

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

可能的解决方案之一(短缺实施-intrinsicContentSize和/或其他子类)是在IB搜索所有自动约束,这可能会干扰您的布局,并尝试在低优先级的位置设置明确的约束。尽管如此,这并不是一直有效的。

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

通常情况下,我不得不做一些工作,使一切正常工作。

+0

我没有删除-awakeFromNib中的所有约束,并以编程方式创建我想要的。我仍然相信,在我的/我们的控制之外,窗口框架和窗口contentView之间存在一些约束,这些约束在这样的边缘情况下与你混淆。在任何情况下,我在上面的答案中引用的github解决方案(带有subclassed NSView,over-ridden intrinsicContentSize)对我来说工作正常。 – pjv

+0

唯一的情况是,我在窗口框架和内容视图之间存在约束问题时,我启用了检查器栏以查看文本视图,但这是我想的某种错误。我的配置几乎与你的配置相同(一种垂直手风琴完全用约束实现,我不必实现'-intrinsicContentSize',但是我必须玩弄优先级。 – skh

相关问题