我无法设置自定义UITableView节标题的动画。
目标是创建可折叠部分。
当我第一次按照预期动画时点击自定义标题,然而每次之后它会在原始位置留下副本并为另一个设置动画。
图片示例:
alt text http://img35.imageshack.us/img35/4018/screenshot2010022722565.png
alt text http://img291.imageshack.us/img291/8287/screenshot2010022723035.png
我的自定义标题:
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
customView.backgroundColor = [UIColor lightGrayColor];
UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.opaque = NO;
headerLabel.textColor = [UIColor darkGrayColor];
headerLabel.font = [UIFont boldSystemFontOfSize:16];
headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0);
headerLabel.textAlignment = UITextAlignmentCenter;
NSDictionary *dictionary = [self.data objectAtIndex:section];
headerLabel.text = [dictionary objectForKey:@"Title"];
[customView addSubview:headerLabel];
// add button to right corner of section
UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)];
headerButton.center = CGPointMake( 160.0, 22.0);
headerButton.backgroundColor = [UIColor clearColor];
headerButton.tag = section;
[headerButton addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside];
[customView addSubview:headerButton];
return customView;
}
我的动画方法:
- (void) expandSection:(id)sender {
if (expandedSection == [sender tag]) {
expandedSection = -1;
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
}else if (expandedSection == -1){
expandedSection = [sender tag];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
}else{
[self.tableView beginUpdates];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
expandedSection = [sender tag];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
//[self.tableView reloadData];
}
我不确定最新情况,但实例表明我需要处理一些问题。我尝试过一些东西,但我无法弄清楚这一点。任何有关这方面的帮助都会很棒!
编辑:我认为问题是reloadSections导致自定义视图实例化。我无法释放视图,因为我需要它作为动画更新的参考。关于我能做些什么来解决这个问题的任何想法?
答案 0 :(得分:8)
找到解决方案。
每次更改前都需要重新加载表格。这样,在进行任何更改之前,表格处于最新状态。
添加 [self.tableView reloadData]; 作为“expandSection”方法中的第一个条目。
CODE:
- (void) expandSection:(id)sender {
[self.tableView reloadData];
if (expandedSection == [sender tag]) {
expandedSection = -1;
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
}else if (expandedSection == -1){
expandedSection = [sender tag];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
}else{
[self.tableView beginUpdates];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
expandedSection = [sender tag];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
//[self.tableView reloadData];
}
答案 1 :(得分:2)
我有一个类似的问题,这是由使用动态高度单元格引起的。我有一个可扩展的自定义标题视图,当我更新tableView以插入和删除该节的相关行(意味着它们正在展开,分别折叠)时,作为UITableViewHeaderFooterView
的子类的节标题未被回收。所以基本上新的一个被分配并添加到旧的一个导致重叠的视图。单元标识符已正确设置,因此必须是其他内容。当我删除tableView.sectionHeaderHeight = UITableViewAutomaticDimension
并实施func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
后,视图得到了正确回收,每个部分只显示了一个标题视图。
我实际工作的另一个解决方案是使用UITableViewCell
代替UITableViewHeaderFooterView
,当您func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
返回return cell.contenView
时,这将有效,因为方法需要返回一个UIView,因为UITableViewCell的contentView
是一个UIView它可以正常工作。其背后的想法是通过UITableViewCell使用UITableView的回收机制,并在配置后返回其内容。
结论。问题很可能由UITableViewHeaderFooterView
引起,与自定义tableView单元格和UITableViewAutomaticDimension
一起使用,而不是手动计算单元格高度。