如何使用objective-c中的約束以編程方式創建UIView的2 x 2網格?以編程方式使用約束來佈局多個視圖
例如,我有四個UIViews,其名稱對應於它們的行/列位置(oneOne,oneTwo,twoOne,twoTwo),如下圖所示。
這是我目前使用的代碼:
-(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]];
您是否需要使用視覺格式?我建議使用像Masonry或KeepLayout這樣的佈局庫 - 從代碼創建複雜佈局會更容易。 – Losiowaty
在所有約束中,將選項設置爲0而不是NSLayoutFormatDirectionLeadingToTrailing,並查看您是否得到期望的結果 –
我從來沒有聽說過這些庫,現在我來看看。我很希望這種佈局相當簡單,並不罕見。 – Ryan