我的视图底部有以下表格视图
它具有高度约束(优先级250)和对视图底部的约束(优先级1000)。高度约束指向我的视图控制器中的“IBOutlet”。
我想将表格视图的高度从44.0f更改为7 * 44.0f,所以我正在做的就是这个;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.categoriesShown) {
[self hideCategories];
} else {
[self showCategories];
}
self.categoriesShown = !self.categoriesShown;
}
- (void)showCategories
{
self.categoriesHeightConstraint.constant = self.categories.count * 44.0f;
}
- (void)hideCategories
{
self.categoriesHeightConstraint.constant = 44.0f;
}
工作正常。但是,当我尝试使用以下代码动画所有这些时:
- (void)showCategories
{
[self.categoryTableView layoutIfNeeded];
[UIView transitionWithView:self.categoryTableView duration:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{
self.categoriesHeightConstraint.constant = self.categories.count * 44.0f;
[self.categoryTableView layoutIfNeeded];
} completion:nil];
}
- (void)hideCategories
{
[self.categoryTableView layoutIfNeeded];
[UIView transitionWithView:self.categoryTableView duration:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{
self.categoriesHeightConstraint.constant = 44.0f;
[self.categoryTableView layoutIfNeeded];
} completion:nil];
}
然后,tableview和视图底部之间的约束以某种方式被破坏,这是我在显示然后隐藏tableview时得到的
有没有人知道为什么,约束被破坏但只有在我尝试动画更改时?
更新:UIButton约束两个按钮都有宽度和高度约束以及视图底部的约束。左侧的按钮具有视图的前导约束。右边的一个对视图有一个尾随约束。如上所述,两者都对表视图具有水平间距约束。
答案 0 :(得分:1)
我认为您的问题出在此方法调用中:
[UIView transitionWithView:self.categoryTableView duration:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{
self.categoriesHeightConstraint.constant = 44.0f;
[self.categoryTableView layoutIfNeeded];
} completion:nil];
这应该做你想要的:
self.categoriesHeightConstraint.constant = 44.0f;
[UIView animateWithDuration:0.3f animations:^{
[self.view layoutIfNeeded];
//This is assuming the method is called from a view controller.
//You need to call layoutIfNeeded on the superview of what you're animating
}];
此外,Apple文档说,在更改约束之前进行额外[self.view layoutIfNeeded]
调用是一种很好的形式,这样任何不完整的约束都会更改并更新。我会把它留给你。
答案 1 :(得分:0)
所以我认为我得到了你正在寻找的功能:
我给表视图一个与按钮顶部匹配的高度约束,但它可以是任何东西。
然后我得到表格的计算高度并设置它:
tableArray = [[NSMutableArray alloc]init];
[tableArray addObject:@"Row 1"];
[tableArray addObject:@"Row 2"];
etc.......
double newHeight = ([tableArray count] * 44);
CGRect newFrame = CGRectMake(basicTable.frame.origin.x, basicTable.frame.origin.y, basicTable.frame.size.width, newHeight);
[basicTable setFrame:newFrame];
然后对于你的动画,我使用了[UIView animateWithDuration],如下所示:
[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
tableHgtConst.constant = newHeight;
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];
我只是单独留下底部约束,然后更改高度约束以匹配高度强制表而不是向下。