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--这不是我在这里要做的吗?