我希望将视图(屏幕截图中的绿色视图)设置为从底部到顶部布局指南附近定义的高度。我的计划是为垂直距离约束设置动画(绿色框的顶部到顶部布局指南),如下所示:
以下是代码:
- (IBAction)upButton:(UIButton *)sender
{
self.animatedHeightConstraint.constant = 20;
[UIView animateWithDuration:0.5
animations:^{
[self.view layoutIfNeeded];
} completion:nil];
}
很好,这很有效。
然而,这个方案并没有考虑到视图的起始高度,我希望它非常小,可能为零。但是,由于此时我依靠故事板中设置的常量来设置起始高度,因此常量可以是任意数字,具体取决于设备。
我需要一个积极的方法来设置绿色UIView顶部的初始设备无关起点。
我的第一个想法是设置一个高度约束,但编译器检测到冲突,并通过打破约束进行纠正。
我的第二个想法,虽然看起来很笨拙,但是设置两个约束,然后在运行时删除Vertical约束,然后立即删除Height约束并添加回Vertical约束。
我错过了一些明显的东西,还是没有更优雅的方式来解决这个问题?
更新
由于我还没有收到答案,我尝试实施我的第二个想法,详见上文。我通过以下代码在绿色栏中添加了initialHeightConstraint
:
-(void)viewWillAppear:(BOOL)animated
{
[self.view removeConstraint:self.animatedHeightConstraint];
[self.greenBar addConstraint:self.initialHeightConstraint];
self.initialHeightConstraint.constant = 1;
[self.view setNeedsLayout];
}
这很有效。 greenBar
设置为所需的高度,与Soryboard中的constant
不同:
接下来,我尝试换出两个约束并为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]]'
不幸的是,我不明白这意味着什么。可以使用一些帮助!