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];
当然,上面的代码将创建与您的约束完全相同的副本,但您可以对其进行编辑以更改适当的值以满足您的需要。
我有一个免费版本的应用程序,我删除并添加了自动布局约束(以隐藏高级功能),但是如果用户购买了我的应用程序,我想恢复到界面构建器设置的约束条件.
我希望有一种方法可以实现这一点,但到目前为止我还没有找到它?
这是我的
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];
当然,上面的代码将创建与您的约束完全相同的副本,但您可以对其进行编辑以更改适当的值以满足您的需要。