【问题标题】:auto layout modify multiplier of constraint programmatically自动布局以编程方式修改约束乘数
【发布时间】:2015-06-09 02:47:10
【问题描述】:

如何以编程方式修改约束的乘数?我设置了以下内容:

[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]];

【问题讨论】:

标签: ios objective-c autolayout constraints


【解决方案1】:

您将无法更改乘数,因为它是只读的。您必须存储对约束的引用。然后,当您想更改乘数时,您将删除约束并添加一个新约束。

您可以在视图控制器实现中包含这样的方法:

- (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?

【讨论】:

  • 谢谢,我不敢相信我的搜索中没有出现这个问题。也许我只是掩饰了它。
  • 如何传入约束?这将使这个答案更易于实施
【解决方案2】:

为了修改乘数,我使用了在约束之间切换的方法。
您必须创建具有不同优先级的约束,否则会破坏布局。

目标 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()

【讨论】:

    【解决方案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];
    

    【讨论】:

    • 感谢您的建议。我最终改用常量。为了简单起见...self.constraint = [NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:(self.view.frame.size.width / 2)]; [self.view addConstraint:_newsWidthConstraint]; 然后我对其进行了编辑以使其全宽...self.constraint.constant = self.view.frame.size.width;
    【解决方案4】:

    有一种更简单的方法可以使用Layout Anchors 以编程方式修改约束的乘数:

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

    它是这样工作的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2013-06-23
      相关资源
      最近更新 更多