如何以编程方式更改和动画NSLayoutConstraints?

时间:2013-03-03 12:40:22

标签: ios core-animation nslayoutconstraint

我通过NSLayout约束以编程方式定义了一个复杂的布局。现在我发现自己处于一种需要为其中一个元素制作动画的情况。

我需要动画视图crossFadeControlView改变它的高度。这显然意味着另一个需要动态缩小。这可能吗?

如果没有......我的选择是什么?

以下是我的约束:

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[clipGrid]    [sceneLaunchView(==117)][meter(==9)][tempoControl(==58)]|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[tracksView][meter(==9)][tempoControl(==58)]|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[crossFadeControlView]|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[clipGrid]-3-[tracksView(==143)][crossFadeControlView]|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[sceneLaunchView]-3-[tracksView][crossFadeControlView]|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tempoControl][crossFadeControlView]|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[meter][crossFadeControlView]|" options:0 metrics:nil views:views]];

1 个答案:

答案 0 :(得分:0)

当然,你可以做到。从你的约束中判断出来的位置有点难,但是,例如,如果你改变了crossFadeView的高度,clipGrid会自动收缩,因为它没有明确的高度设置,而轨道视图将保持其高度,因为它确实有一个定义的高度。 screenLaunchView,tempoControl和meter也会因同样的原因自动缩小。

要更改crossFadeView的高度,您必须为其创建高度约束,然后更改该约束的常量值。我通常在动画块上方执行此操作,然后在动画块中的superview上调用layoutSubviews。