使用superview调整特定视图的大小

时间:2014-07-04 04:22:28

标签: macos cocoa autolayout

我有这个:Typical form style

用户希望调整窗口大小,我希望描述字段可以使用super调整大小。 (理想情况下,我希望关键字和描述能够同等地调整大小,但不要发疯。)

我过去通过选择上半部并在左上角添加约束,然后选择下半部并向左下右添加约束来设法完成此工作,如下所示:

Autolayout top half

Autolayout bottom half

然后最后

Description fix

但是这突然停止了工作。窗口突然只允许水平调整,而不是垂直调整。

编辑:来自描述滚动视图的constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationVertical输出:

(
    "<NSContentSizeLayoutConstraint:0x6100002b5600 V:[NSTextField:0x608000194ec0(17)] Hug:750 CompressionResistance:750>",
    "<NSLayoutConstraint:0x608000098ba0 V:[NSTextField:0x608000194ec0]-(9)-[NSTextField:0x608000195060]>",
    "<NSContentSizeLayoutConstraint:0x6100002b57e0 V:[NSTextField:0x608000195060(17)] Hug:750 CompressionResistance:750>",
    "<NSLayoutConstraint:0x6080000969e0 V:[NSTextField:0x608000195060]-(72)-[NSTextField:0x6080001949e0]>",
    "<NSContentSizeLayoutConstraint:0x6100002b54e0 V:[NSTextField:0x608000194d20(17)] Hug:750 CompressionResistance:750>",
    "<NSContentSizeLayoutConstraint:0x6100002b53c0 V:[NSTextField:0x608000194b80(17)] Hug:750 CompressionResistance:750>",
    "<NSLayoutConstraint:0x60800009a0e0 V:[NSTextField:0x608000194910]-(30)-[NSTextField:0x608000194b80]>",
    "<NSContentSizeLayoutConstraint:0x6100002b50c0 V:[NSTextField:0x608000194910(17)] Hug:750 CompressionResistance:750>",
    "<NSLayoutConstraint:0x60800009a220 V:[NSTextField:0x608000194840]-(NSSpace(8))-[NSTextField:0x608000194910]>",
    "<NSContentSizeLayoutConstraint:0x6100002b4fa0 V:[NSTextField:0x608000194840(17)] Hug:750 CompressionResistance:750>",
    "<NSLayoutConstraint:0x60800009a3b0 V:|-(22)-[NSTextField:0x608000194840]   (Names: '|':NSView:0x608000128fc0 )>",
    "<NSLayoutConstraint:0x608000099410 NSTextField:0x608000194ec0.baseline == NSTextField:0x608000194f90.baseline>",
    "<NSLayoutConstraint:0x608000098ce0 NSTextField:0x608000194f90.centerY == NSTextField:0x608000194ec0.centerY>",
    "<NSLayoutConstraint:0x6080000987e0 NSTextField:0x6080001949e0.top == NSScrollView:0x6080001c6ea0.top>",
    "<NSLayoutConstraint:0x608000099730 NSTextField:0x608000194d20.baseline == NSTextField:0x608000194df0.baseline>",
    "<NSLayoutConstraint:0x608000096a30 NSTextField:0x608000194df0.centerY == NSTextField:0x608000194d20.centerY>",
    "<NSLayoutConstraint:0x608000099fa0 NSTextField:0x608000194b80.baseline == NSTextField:0x608000194c50.baseline>",
    "<NSAutoresizingMaskLayoutConstraint:0x61000068a870 h=-&- v=-&- V:[NSView:0x608000128fc0]-(0)-|   (Names: '|':NSThemeFrame:0x100350960'PDF Properties' )>",
    "<NSAutoresizingMaskLayoutConstraint:0x61000068a8c0 h=-&- v=-&- V:|-(16)-[NSView:0x608000128fc0]   (Names: '|':NSThemeFrame:0x100350960'PDF Properties' )>",
    "<NSLayoutConstraint:0x610000687d00 'NSWindow-current-height' V:[NSThemeFrame:0x100350960'PDF Properties'(532@500)] priority:500>",
    "<NSLayoutConstraint:0x608000098600 V:[NSScrollView:0x6080001c6f90]-(5)-[NSScrollView:0x6080001c6ea0]>",
    "<NSLayoutConstraint:0x608000098b50 V:[NSTextField:0x608000194f90]-(5)-[NSScrollView:0x6080001c6f90]>",
    "<NSLayoutConstraint:0x608000098e20 V:[NSTextField:0x608000194df0]-(5)-[NSTextField:0x608000194f90]>",
    "<NSLayoutConstraint:0x6080000991e0 V:[NSTextField:0x608000194c50]-(5)-[NSTextField:0x608000194df0]>"
)

2 个答案:

答案 0 :(得分:1)

这些屏幕截图并没有向我传达太多信息。在文档大纲视图中显示约束可能更好,但实际上文本最好。您可以在代码中添加类似的内容,然后将输出粘贴到您的问题中:

NSLog(@"%@", [_descriptionScrollView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationVertical]);

无论如何,我认为你应该拥有的是像这种视觉格式语言字符串所代表的约束(或多或少):

V:|-titleTextField-6-authorsScrollView(==40)-6-isbnTextField-6-publisherTextField-6-versionTextField-
6-descriptionScrollView(==keywordsScrollView,>=authorsScrollView)-6-keywordsScrollView-6-rightsTextField-
6-licenseTextField-6-licenseURLTextField-6-ccURLTextField-saveMetadataButton-|

我把它打破了,以便于阅读。

这个想法是除了描述和关键字滚动视图之外的所有内容的垂直距离都是固定的。文本字段的高度是固有的。作者滚动视图的高度由高度约束指定。控件之间的距离固定在标准距离或指定距离。

我已指定说明滚动视图的高度等于关键字滚动视图的高度。这样他们应该在所有其他所需距离进行切割之后均匀地划分窗口高度的剩余部分。我为滚动视图设置了一个最小高度,这样窗口的高度就不能超过它们与作者滚动视图一样高的点。

我的字符串中并未提及所有控件。字段标签和&#34;复制到剪贴板&#34;和#34;显示许可证&#34;按钮应设置为与其线上的其他控件共享基线。同样,应该相对于许可证文本字段设置图像视图。

您需要避免超出这些限制的超出限制。您将过度约束您的布局,这将阻止窗口调整大小(或甚至可能导致不可满足的约束)。你不必像我做的那样完成它,但你不应该有更多。

另外,仅仅因为我在代码中表达了这一点并不意味着你应该这样做。您可以在IB中执行此操作。用类似代码的文本来解释它是最容易的。

答案 1 :(得分:0)

添加旁注,因为它让我吵了很久:

如果您有无法垂直调整大小的子视图,这些将最终将整个内容拉到一起。执行此操作的视图示例为NSTextField

例如,如果你设置了V:|-[textField]-|,那么无论你做什么,包含的视图都会缩小到约21个点。