我想進入自動佈局的深處,所以我想以編程方式進行編程以便正確理解它。我知道如何通過故事板很好地使用它。現在,這是我我做(在viewDidAppear:
)AutoLayout以編程方式不起作用
-(void)scenario2{
PGView *viewA = [[PGView alloc]initWithFrame:CGRectMake(100, 100, 100, 100) andBackgroundColor:[UIColor blackColor]];
[self.view addSubview:viewA];
PGView *viewB = [[PGView alloc]initWithFrame:CGRectMake(200, 300, 100, 100) andBackgroundColor:[UIColor yellowColor]];
[self.view addSubview:viewB];
viewA.translatesAutoresizingMaskIntoConstraints = NO;
viewB.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *constraint;
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[viewB(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewB)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[viewB(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewB)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[viewA(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewA)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[viewA(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewA)]];
//problem statement
constraint = [NSLayoutConstraint constraintWithItem:viewA attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:viewB attribute:NSLayoutAttributeWidth multiplier: 3.0f constant: 0.0f];
[self.view addConstraint:constraint];
NSLog(@"%@",viewA);
NSLog(@"%@",viewB);
}
所以我在這裏已經初始化兩種不同顏色的看法。
我知道我需要設置屬性。
translatesAutoresizingMaskIntoConstraints
到NO
,然後應用任何新的約束條件。所以我已經做到了。現在我指定兩個視圖的高度和寬度。因此,這兩個視圖的x_position和y_position都是0.我運行代碼並得到預期結果。兩個視圖都在點(0,0)處具有指定的高度和寬度。
問題
現在,當我寫的語句「問題語句」根據viewA的寬度,其不工作以調節viewB的寬度。
此外,當我打印視圖viewA和viewB時,它將幀打印爲(0,0,0,0)。
任何人都可以解釋我的這種行爲嗎?
編輯:這裏有一些修改,我有made.I使用「hasAmbiguousLayout」,其做工精細now.Now已經檢查了雙方的意見不確定性應該是什麼,下一步,如果我想調整viewB的寬度是viewA的寬度的三倍?
-(void)scenario2{
PGView *viewA = [PGView new];
viewA.backgroundColor = [UIColor yellowColor];
[self.view addSubview:viewA];
PGView *viewB = [PGView new];
viewB.backgroundColor = [UIColor blackColor];
[self.view addSubview:viewB];
viewA.translatesAutoresizingMaskIntoConstraints = NO;
viewB.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *constraint;
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[viewB(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewB)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[viewB(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewB)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[viewA(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewA)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[viewA(==200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewA)]];
NSLog(@"%d",viewA.hasAmbiguousLayout);
NSLog(@"%d",viewB.hasAmbiguousLayout);
NSLog(@"%@",viewA);
NSLog(@"%@",viewB);
}
確定我會嘗試糾正它,並在一個瞬間回覆。 – Reckoner
我已更新我的問題,並在我的代碼中進行了一些修改。請給我解釋一下嗎? – Reckoner
@Reckoner - 好的,所以,就像在我上面的代碼片段中,從A的VFL中移除寬度定義,然後您可以使用乘數約束。現在,我定義了前導約束和頂端約束(我從您試圖設置框架中推斷出的),這在編輯時並未使用,但希望這仍然足以說明我的觀點。 – Rob