指向视觉格式语言(VFL)约束的指针?

时间:2015-02-10 17:13:10

标签: ios objective-c autolayout nslayoutconstraint

我想知道是否有可能获得通过使用可视格式语言创建的约束的指针。

举一个简单的例子,假设我为一个视图创建了一个约束数组,使它固定在它的超级视图的顶部,左侧和底部,但宽度为100,我想获得一个指针到此宽度约束以稍后以编程方式更改它。

VFL就是这样的:

UIView *insertedView = [[UIView alloc] init];
insertedView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview: insertedView];

NSDictionary *views = NSDictionaryOfVariableBindings(insertedView);
NSDictionary *metrics = @{ @"viewWidth" : @(100.0) };

NSArray *constraintsH = [NSLayoutConstraint constraintsWithVisualFormat:@"|[insertedView(viewWidth)" options:0 metrics:metrics views:views];

NSArray *constraintsV = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[insertedView]|" options:0 metrics:nil views:views];

[self.view addConstraints: constraintsH];
[self.view addConstraints: constraintsV];

在上面的例子中是否可以获得指向宽度约束为100.0的NSLayoutConstraint实例?

我知道我可以通过另一种方式来解决它,通过constraintWithItem分别创建宽度约束:attribute:relatedBy:toItem:attribute:multiplier:constant,但我很好奇是否有一个方法可以用纯粹的方法做到这一点VFL。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用NSArray&#39} - objectAtIndex:- indexOfObjectPassingTest:

NSUInteger index = [constraints indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return ((NSLayoutConstraint *)obj).firstAttribute == NSLayoutAttributeWidth;
}];

NSLayoutConstraint *widthConstraint = [constraints objectAtIndex:index];

如果您有多个宽度约束(例如,在不同的优先级,例如),您可以更加具体地在块中进行测试。