我在滚动视图中有一个UITableView
。所以我试图使用UITableView
做一个类似手风琴的组件。所以我需要扩展UITableView
以添加更多单元格。在这种情况下,我必须用动画增加UIScrollView
的高度,使其与表动画相匹配。
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger row = [indexPath row];
BOOL preventReopen = NO;
if (row == expandedRowIndex + 1 && expandedRowIndex != -1)
return nil;
[tableView beginUpdates];
if (expandedRowIndex != -1)
{
familyTableView.frame = CGRectMake(familyTableView.frame.origin.x, familyTableView.frame.origin.y, familyTableView.frame.size.width, 3*50+22);
toolsTableView.frame = CGRectMake(toolsTableView.frame.origin.x, familyTableView.frame.origin.y + familyTableView.frame.size.height + 20, toolsTableView.frame.size.width, 4*50+22);
myAccountTableView.frame = CGRectMake(myAccountTableView.frame.origin.x, toolsTableView.frame.origin.y + toolsTableView.frame.size.height + 20, myAccountTableView.frame.size.width, 2*50+22);
settingsScrollView.contentSize = CGSizeMake(320, familyTableView.frame.size.height + toolsTableView.frame.size.height+ myAccountTableView.frame.size.height + 380);
settingsScrollView.contentInset = UIEdgeInsetsMake(0, 0, familyTableView.frame.size.height + toolsTableView.frame.size.height+ myAccountTableView.frame.size.height + 380, 0);
NSInteger rowToRemove = expandedRowIndex + 1;
preventReopen = row == expandedRowIndex;
if (row > expandedRowIndex)
row--;
expandedRowIndex = -1;
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:rowToRemove inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
}else {
familyTableView.frame = CGRectMake(familyTableView.frame.origin.x, familyTableView.frame.origin.y, familyTableView.frame.size.width, (3*50+22) + 100);
toolsTableView.frame = CGRectMake(toolsTableView.frame.origin.x, familyTableView.frame.origin.y + familyTableView.frame.size.height + 20, toolsTableView.frame.size.width, 4*50+22);
myAccountTableView.frame = CGRectMake(myAccountTableView.frame.origin.x, toolsTableView.frame.origin.y + toolsTableView.frame.size.height + 20, myAccountTableView.frame.size.width, 2*50+22);
settingsScrollView.contentSize = CGSizeMake(320, familyTableView.frame.size.height + toolsTableView.frame.size.height+ myAccountTableView.frame.size.height + 380);
settingsScrollView.contentInset = UIEdgeInsetsMake(0, 0, familyTableView.frame.size.height + toolsTableView.frame.size.height+ myAccountTableView.frame.size.height + 380, 0);
}
NSInteger rowToAdd = -1;
if (!preventReopen)
{
rowToAdd = row + 1;
expandedRowIndex = row;
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:rowToAdd inSection:0]] withRowAnimation:UITableViewRowAnimationTop];
}
[tableView endUpdates];
return nil;
}
我不擅长动画。任何帮助是极大的赞赏。我需要的是当我们[tableView beginUpdates]
时,我们必须开始为UIScrollView设置调整大小效果的动画,它应该在[tableView endUpdates]
执行时结束。因此手风琴执行完美无缺。提前感谢您的帮助..
答案 0 :(得分:1)
由于您要更改视图属性(滚动视图的框架),我建议您使用UIView动画为框架设置动画。您可能需要略微调整时间以使其看起来完美但我相信动画是EaseInEaseOut并且需要0.4秒。你会像这样动画:
[UIView animateWithDuration:0.4 animations:^{
// Change all your animatable properties like your frames here...
yourScrollView.frame = theNewScrollViewFrame;
}];
答案 1 :(得分:0)
我最后通过以下代码
修复了它// Start the animation before the begin update and commit it after the end update.
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
[tableView beginUpdates];
<My code which I given in the question>
[tableView endUpdates];
[UIView commitAnimations];
希望将来有所帮助..