2

我想要一个 iPad 布局,它有两个并排的面板,以填充屏幕的宽度,并且两者都与屏幕一样高。我的尝试导致如下

self.view addConstraints:
    @"|[_sidePanel(300)]-1.0-[_mainPanel]|"
    @"V:|[_sidePanel]|"
    @"V:|[_mainPanel]|"

在 __sidePanel_ 内部,我试图对子视图创建更多约束。

注意 _sidePanel 视图是一个 UIScrollView。

我想在侧面板中堆叠 2 个视图。
所以我将以下约束添加到__sidePanel_。

_sidePanelView addConstraints:
    @"|[_top(300)]|"
    @"|[_bottom(300)]|"
    @"V:|[_top]-5.0-[_bottom]|"

看来我需要为这两个视图指定宽度以避免歧义。

但我希望底部视图填充 __sidePanel_ 的剩余空间。

如果我只是将 __bottom_ 固定到 __top_ 的底部(根据其内容在某个点获得定义的高度)及其父 __sidePanel_ 的底部,则 __sidePanel_ 和 __bottom_ 都是模棱两可的;我猜这是有道理的,因为约束非常相似(并且不会通过将 __bottom_ 的约​​束添加到 __sidePanel_ 视图而不是最顶层的 self.view 来避免)。

如果我硬编码 __bottom_ 的高度,我会解决歧义,但我不想要定义的高度;我希望它填充 __sidePanel_ 中的剩余空间。

关于我可以尝试解决歧义但仍能实现我所追求的任何建议?

4

2 回答 2

3

您需要为 top 或 bottom 指定一个高度 - 听起来 top 在某些时候会获得一个定义的高度,但您最初需要为它设置一个定义的高度,您可以稍后更改。

此外,无需指定顶部或底部的宽度 (300),因为您已将它们固定到 sidePanel 的侧面,它本身具有定义的宽度。所以这些约束条件很好,没有歧义:

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[_sidePanel(300)]-1.0-[_mainPanel]|" options:0 metrics:nil views:viewsDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_sidePanel]|" options:0 metrics:nil views:viewsDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_mainPanel]|" options:0 metrics:nil views:viewsDict]];

    [_sidePanelView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[_top]|" options:0 metrics:nil views:viewsDict]];
    [_sidePanelView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[_bottom]|" options:0 metrics:nil views:viewsDict]];
    [_sidePanelView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_top]-5.0-[_bottom]|" options:0 metrics:nil views:viewsDict]];
    self.topHeightCon = [NSLayoutConstraint constraintWithItem:self.top attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:300];
    [self.top addConstraint:self.topHeightCon];

稍后,当您计算顶部的实际高度时,您可以使用 self.topHeightCon.constant = (some value) 来调整它的高度。

于 2013-08-07T00:42:09.197 回答
1

在我的情况下,归结为我试图让子视图约束到其边界的视图是一个 UIScrollView,它没有发生。从那以后,我将其更改为 UIView 并瞧瞧我的约束工作。你有它。

于 2013-08-14T14:56:14.590 回答