2015-11-10 96 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

相關問題