ObjC,以编程方式添加/删除后恢复到界面生成器自动布局约束?

ObjC, revert to interface builder autolayout constraints, after adding / removing programmatically?

我有一个免费版本的应用程序,我删除并添加了自动布局约束(以隐藏高级功能),但是如果用户购买了我的应用程序,我想恢复到界面构建器设置的约束条件.

我希望有一种方法可以实现这一点,但到目前为止我还没有找到它?

这是我的

if (!purchased) {

[self.tblOtherAccounts addConstraints:[NSLayoutConstraint
   constraintsWithVisualFormat:@"V:[tblOtherAccounts(==0)]"
   options:0
   metrics:nil
   views:NSDictionaryOfVariableBindings(tblOtherAccounts)]];


NSDictionary *views = @{ @"tblOtherAccounts" : self.tblOtherAccounts, 
   @"butBackAllAc" : butBackAllAc  };

[self.view removeConstraints:[NSLayoutConstraint 
   constraintsWithVisualFormat:@"V:[tblOtherAccounts]-(12)-[butBackAllAc]"
   options:0
   metrics:nil
   views:views]];

[self.view addConstraints:[NSLayoutConstraint 
   constraintsWithVisualFormat:@"V:[tblOtherAccounts]-(0)-[butBackAllAc]"
   options:0
   metrics:nil
   views:views]];
}

我认为,你不能完全那样做。 您需要在代码中执行该逻辑。 IE。应用一些约束,然后根据用户操作应用另一组约束。

示例: 您有 2 个约束条件:

@property ... topConstraint;
@property ... leadingConstraint;

一开始你给它们赋了一些值:

topConstraint.constant = 100;
leadingConstraint.constant = 100;

经过一些用户操作后,修改它们:

topConstraint.constant = 150;
leadingConstraint.constant = 150;

添加一个 IBOutlet 以将您的约束存储在 ViewController :

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *myConstraint;

然后更新它的值:

_myConstraint.constant = 100.0f;
[_myView setNeedsUpdateConstraints];
[_myView layoutIfNeeded];

关于您对 "equals" 设置关系的评论,我认为您无法做到这一点。

不过,您可以做的一件事是使用故事板生成的约束作为占位符:

NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:_myConstraint.firstItem
                                                                 attribute:_myConstraint.firstAttribute
                                                                 relatedBy:_myConstraint.relation
                                                                    toItem:_myConstraint.secondItem
                                                                 attribute:_myConstraint.secondAttribute
                                                                multiplier:_myConstraint.multiplier
                                                                  constant:_myConstraint.constant];

[_myConstraint.secondItem removeConstraint:_myConstraint];
[constraint.secondItem addConstraint:newConstraint];

当然,上面的代码将创建与您的约束完全相同的副本,但您可以对其进行编辑以更改适当的值以满足您的需要。