2015-11-10 97 views
0

如何使用objective-c中的约束以编程方式创建UIView的2 x 2网格?以编程方式使用约束来布局多个视图

例如,我有四个UIViews,其名称对应于它们的行/列位置(oneOne,oneTwo,twoOne,twoTwo),如下图所示。

layout using constraints

这是我目前使用的代码:

-(void)buildGrid { 

    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    UIView *oneOne = [UIView new]; 
    [oneOne setBackgroundColor:[UIColor redColor]]; 
    [oneOne setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    UIView *oneTwo = [UIView new]; 
    [oneTwo setBackgroundColor:[UIColor greenColor]]; 
    [oneTwo setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    UIView *twoOne = [UIView new]; 
    [twoOne setBackgroundColor:[UIColor blueColor]]; 
    [twoOne setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    UIView *twoTwo = [UIView new]; 
    [twoTwo setBackgroundColor:[UIColor purpleColor]]; 
    [twoTwo setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [self.view addSubview:oneOne]; 
    [self.view addSubview:oneTwo]; 
    [self.view addSubview:twoOne]; 
    [self.view addSubview:twoTwo]; 

    NSDictionary *viewsDict = NSDictionaryOfVariableBindings(oneOne, oneTwo, twoOne, twoTwo); 



    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[oneOne]-10-[twoOne]-10-|" 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:viewsDict]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[oneOne]-10-[twoOne]-10-|" 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:viewsDict]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[oneTwo]-10-[twoTwo]-10-|" 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:viewsDict]]; 


    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[twoOne]-10-[twoTwo]-10-|" 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:viewsDict]]; 

} 

我跟了几个教程,但没有(到目前为止)已经描述了如何创建这样的“网格”布局,他们已经简单得多像UIViews单“列”,但是,当我有进一步的“列”我得到有关无法维持的约束错误:

Unable to simultaneously satisfy constraints. 
Probably at least one of the constraints in the following list is one you don't want. 

这段代码工作正常,如果我使它四个UIViews下来或跨屏幕,但不是如果我使它2×2。我做错了什么?

更新

按照接受的答案的约束应该是:你

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[oneOne]-10-[twoOne(==oneOne)]-10-|" 
                    options:0 
                    metrics:nil 
                    views:viewsDict]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[oneTwo]-10-[twoTwo(==oneTwo)]-10-|" 
                    options:0 
                    metrics:nil 
                    views:viewsDict]]; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[oneOne]-10-[oneTwo(==oneOne)]-10-|" 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:viewsDict]]; 


    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[twoOne]-10-[twoTwo(==twoOne)]-10-|" 
                    options:0 
                    metrics:nil 
                    views:viewsDict]]; 
+0

您是否需要使用视觉格式?我建议使用像Masonry或KeepLayout这样的布局库 - 从代码创建复杂布局会更容易。 – Losiowaty

+0

在所有约束中,将选项设置为0而不是NSLayoutFormatDirectionLeadingToTrailing,并查看您是否得到期望的结果 –

+0

我从来没有听说过这些库,现在我来看看。我很希望这种布局相当简单,并不罕见。 – Ryan

回答

1

首先在第二约束错误。它应该是:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[oneOne]-10-[oneTwo]-10-|" 
                    options:NSLayoutFormatDirectionLeadingToTrailing 
                    metrics:nil 
                    views:viewsDict]]; 

此外,您的布局仍不包含有关子视图大小(宽度和高度)的任何信息。您必须添加像这样的约束(伪代码)

oneOne.width = oneTwo.width = twoOne.width = twoTwo.width 
oneOne.height = oneTwo.height = twoOne.height = twoTwo.height 
+1

这问题是由于没有将宽度设置为任何东西以及在突出显示时修正第二个约束而造成的。我已经在约束中设置了宽度:“V:| -10- [oneOne] -10- [twoOne(== oneOne)] - 10- |”。谢谢。 – Ryan

+0

甚至不知道'[twoOne(== oneOne)]'技巧,所以也谢谢你:) – psci

相关问题