同様の問題がありましたが、ここに私の解決策があります。基本的に、解決策には、セルの高さを変更して「非表示」にすることが含まれます。
セクション ヘッダーをカスタム UIControl に変更して、他のセルのように見えるようにし、フォロー メソッドを実装して、選択したセクションの外側の行を「非表示」にしました。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == _selectedSection) {
// If it is the selected section then the cells are "open"
return 60.0;
} else {
// If is not the selected section then "close" the cells
return 0.0;
}
}
カスタム ヘッダーには、次のコードを使用しました。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
CGFloat height = [self tableView:tableView heightForHeaderInSection:section];
// Here you can use whatever you want
CGFloat width = 640.0;
UIControl *view = [[UIControl alloc] initWithFrame:CGRectMake(0.0, 0.0, width, height)];
view.tag = section;
// This code is used by my custom UIControl
//
// to change the style for each state
// view.sectionSelected = (section == _selectedSection);
//
// and to change the title
// view.title = [self tableView:tableView titleForHeaderInSection:section];
// This event is used to "close" or "open" the sections
[view addTarget:self action:@selector(didSelectSectionHeader:) forControlEvents:UIControlEventTouchUpInside];
return view;
}
より魅力的にするために、次のメソッドにアニメーションを追加しました。
- (void)didSelectSectionHeader:(id)sender
{
if ([sender isKindOfClass:[UIControl class]]) {
// Save the old section index
int oldSelection = _selectedSection;
// Get the new section index
int tag = ((UIControl *)sender).tag;
// Get sections quantity
int numSections = [self numberOfSectionsInTableView:_tableView];
// Check if the user is closing the selected section
if (tag == _selectedSection) {
_selectedSection = -1;
} else {
_selectedSection = tag;
}
// Begin animations
[_tableView beginUpdates];
// Open the new selected section
if (_selectedSection >= 0 && _selectedSection < numSections) {
[_tableView reloadSections:[NSIndexSet indexSetWithIndex:_selectedSection] withRowAnimation:UITableViewRowAnimationAutomatic];
}
// Close the old selected section
if (oldSelection >= 0 && oldSelection < numSections) {
[_tableView reloadSections:[NSIndexSet indexSetWithIndex:oldSelection] withRowAnimation:UITableViewRowAnimationAutomatic];
}
[_tableView endUpdates];
}
}