如何解决模棱两可的布局?

时间:2013-08-06 21:44:12

标签: ios autolayout

我想要一个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_中的剩余空间。

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

2 个答案:

答案 0 :(得分:3)

你需要为顶部或底部指定一个高度 - 它听起来像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];

稍后,当您计算top的实际高度时,可以使用self.topHeightCon.constant =(某个值)来调整其高度。

答案 1 :(得分:1)

在我的情况下,它归结为我试图让子视图限制其边界的视图是UIScrollView,这没有发生。我从那以后把它变成了UIView,并且我的约束工作了。你有它。