Ios 设置约束动画UIView的初始高度

Ios 设置约束动画UIView的初始高度,ios,uiview,uiviewanimation,nslayoutconstraint,Ios,Uiview,Uiviewanimation,Nslayoutconstraint,我想给一个视图(屏幕截图中的绿色视图)设置动画,从它的底部向上,直到接近顶部布局指南定义的高度。我的计划是设置垂直距离约束(绿色框顶部到顶部布局指南)的动画,如下所示: 代码如下: - (IBAction)upButton:(UIButton *)sender { self.animatedHeightConstraint.constant = 20; [UIView animateWithDuration:0.5 animations

我想给一个视图(屏幕截图中的绿色视图)设置动画,从它的底部向上,直到接近顶部布局指南定义的高度。我的计划是设置垂直距离约束(绿色框顶部到顶部布局指南)的动画,如下所示:

代码如下:

- (IBAction)upButton:(UIButton *)sender
{
    self.animatedHeightConstraint.constant = 20;
    [UIView animateWithDuration:0.5
                     animations:^{
                         [self.view layoutIfNeeded];
                     } completion:nil];
}
好的,这个有效

但是,这个方案没有考虑视图的起始高度,我希望它非常小,可能是零。但由于此时我依靠故事板中设置的常数来设置起始高度,该常数可以是任意数字,具体取决于设备

我需要一个积极的方法来为绿色UIView的顶部设置一个与设备无关的初始起点

我的第一个想法是设置高度约束,但编译器检测到冲突,并通过打破约束进行纠正

我的第二个想法,虽然看起来很笨拙,但是设置两个约束,然后在运行时删除垂直约束,然后立即删除高度约束并重新添加垂直约束

我是否错过了一些显而易见的东西,或者真的没有更优雅的方式来处理这个问题

更新:

因为我还没有得到答案,所以我尝试实现我的第二个想法,如上所述。我通过以下代码向绿色条添加了
initialHeightConstraint

-(void)viewWillAppear:(BOOL)animated
{
    [self.view removeConstraint:self.animatedHeightConstraint];
    [self.greenBar addConstraint:self.initialHeightConstraint];

    self.initialHeightConstraint.constant = 1;
    [self.view setNeedsLayout];

}
这很有效。绿色条
设置为所需高度,该高度不同于Soryboard中的
常数

接下来,我尝试交换这两个约束并设置
animatedHeightConstraint
的动画:

- (IBAction)upButton:(UIButton *)sender
{
    [self.greenBar removeConstraint:self.initialHeightConstraint];
    [self.view addConstraint:self.animatedHeightConstraint];

    [self.view setNeedsLayout];


    self.animatedHeightConstraint.constant = 20;

    [UIView animateWithDuration:0.5
                     animations:^{
                         [self.view layoutIfNeeded];
                     } completion:nil];
}
这不管用。崩溃原因:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: [constraint isKindOfClass:[NSLayoutConstraint class]]'

不幸的是,我不明白这意味着什么。我需要一些帮助

是否为绿色视图的高度约束设置较低的优先级,并将其顶部与容器关联设置较高的优先级约束?或者调整内容拥抱/限制?我只是尝试了一下——似乎没有任何效果。我先把它降到500,然后降到1。两种方式都没有骰子。不过,我可能用错了。我是第一次。为什么不在代码本身中添加此约束,然后在需要时更改其常量。@jarora--这不是我在这里要做的吗?为绿色视图的高度约束设置一个较低的优先级,并将其顶部与容器相关联设置一个较高的优先级约束?或者调整内容拥抱/限制?我只是尝试了一下——似乎没有任何效果。我先把它降到500,然后降到1。两种方式都没有骰子。不过,我可能用错了。我是第一次。为什么不在代码本身中添加这个约束,然后在需要时更改它的常量呢?@jarora--这不是我在这里要做的吗?