2015-06-09 40 views
1

如何以編程方式修改約束的乘數?我已經設置了以下情況:以編程方式修改約束的乘數限制

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0]]; 

,我需要修改它這樣的:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; 
+0

我不認爲有辦法改變乘數,但你可以刪除約束並設置新的。 – almas

+0

在這裏回答http://stackoverflow.com/questions/19593641/can-i-change-multiplier-property-for-nslayoutconstraint – user3125367

+0

我結束了使用常數,而不是乘數。 –

回答

3

正如有人說,你必須刪除舊的和添加一個新的。如果你不想將它作爲一個屬性存儲,只需設置標識符並搜索以便稍後獲取它

-(NSLayoutConstraint *)constraintWithIndientifer:(NSString *)identifer InView:(UIView *)view{ 
NSLayoutConstraint * constraintToFind = nil; 
for (NSLayoutConstraint * constraint in view.constraints) { 
    if([constraint.identifier isEqualToString:identifer]){ 
     constraintToFind = constraint; 
     break; 
    } 
} 
return constraintToFind; 
} 

然後

NSLayoutConstraint * constraint = [NSLayoutConstraint constraintWithItem:self.yellowView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0]; 
constraint.identifier = @"1234"; 
[self.view addConstraint:constraint]; 

然後你就可以得到這個

NSLayoutConstraint * constraint = [self constraintWithIndientifer:@"1234" InView:self.view]; 
+0

感謝您的建議。我最終使用常量來代替。爲了保持簡單... 'self.constraint = [NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:(self.view.frame.size.width/2)] ; [self。查看addConstraint:_newsWidthConstraint];' 然後我編輯它使其成爲全寬... 'self.constraint.constant = self.view.frame.size.width;' –

5

您將無法更改乘數,因爲它是隻讀的。你將不得不存儲對約束的引用。然後,當您想要更改乘數時,您將刪除該約束並添加一個新約束。

您可以在您的視圖控制器實現這樣的方法:

- (void)changeMultiplier:(NSLayoutConstraint **)constraint to:(CGFloat)newMultiplier{ 
    NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:(*constraint).firstItem attribute:(*constraint).firstAttribute relatedBy:(*constraint).relation toItem:(*constraint).secondItem attribute:(*constraint).secondAttribute multiplier:newMultiplier constant:(*constraint).constant]; 
    [self.view removeConstraint:(*constraint)]; 
    [self.view addConstraint:newConstraint]; 
    *constraint = newConstraint; 
} 

相關問題:

Can i change multiplier property for NSLayoutConstraint?

+0

謝謝,我不能相信這個問題沒有出現在我的搜索。也許我只是掩飾了它。 –

+0

如何傳入約束?這將使這個答案更清晰地實施 – TheJeff

1

修改乘數我使用約束方式之間的切換。
您必須創建具有不同優先級的約束,否則會破壞佈局。

目標C

NSLayoutConstraint *constraint1, *constraint2; 

// switch between constraints 

constraint1.active = NO; 
constraint2.active = YES; 
[self.view layoutIfNeeded]; 

雨燕2.0

self. constraint1.active = true 
self. constraint2.active = false 
self.view.layoutIfNeeded() 
0

有一個更簡單的方法來修改約束的乘數編程方式使用Layout Anchors

imageView.heightAnchor.constraint(equalTo: imageView.widthAnchor, multiplier: 1.0/2.0).isActive = true 

下面是它如何工作的:

Result view