もう少し調査を行った後、1 つのセルだけを使用して、目的のようなことを行う別の方法を見つけました。このメソッドでは、背の高いセルだけがありますが、セルが選択されていない限り、セルの上半分しか表示できない高さを返します。これを機能させるには、セルの設計で 2 つのことを行う必要があります。最初に IB で「サブビューをクリップ」のボックスを選択して、ボタンがビュー (セル) の外に表示されないようにします。次に、ボタンがすべて互いに垂直に並ぶように制約を作成し、そのうちの 1 つに、セルの上部にある UI 要素の 1 つに垂直方向の間隔の制約を与えます。どのボタンもセルの下部に制約されていないことを確認してください。これを行うことで、ボタンは上部要素 (セルの上部に固定スペースを持つ必要があります) との固定距離を維持します。これにより、セルが短い場合に非表示になります。高さの変化をアニメーション化するには、テーブル ビューで beginUpdates に続いて endUpdates を呼び出すだけです。
#import "TableController.h"
#import "TallCell.h"
@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@property (strong,nonatomic) NSIndexPath *selectedPath;
@end
@implementation TableController
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView registerNib:[UINib nibWithNibName:@"TallCell" bundle:nil] forCellReuseIdentifier:@"TallCell"];
self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine"];
[self.tableView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.theData.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([indexPath isEqual:self.selectedPath]) {
return 88;
}else{
return 44;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TallCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TallCell" forIndexPath:indexPath];
cell.label.text = self.theData[indexPath.row];
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ([self.selectedPath isEqual:indexPath]) {
self.selectedPath = nil;
}else{
self.selectedPath = indexPath;
}
[tableView beginUpdates];
[tableView endUpdates];
}
これにより、最初のセルを選択すると目的のアニメーションが得られると思いますが、現在選択されているセルの下のセルを選択すると、多少異なるアニメーションが得られます。私はそれを回避する方法を知りません。