我想在选择时展开单元格以显示如上图所示的一行按钮。我有一个xib
文件显示一个 320 宽 x 140 高的单元格。我已经把它分类了UITableViewCell
。此外,我还有另一个xib
文件,其中包含上图中以蓝色墨水显示的按钮行。
我可以使用一个非常聪明的人的initWithCoder
答案来加载按钮行!
但是,它会覆盖 MyCustomCell 中的所有其他视图。
如何在单元格展开时加载 xib,使其位于 140pt 高单元格的下半部分?
我不确定你的两个 xib 文件中有什么,但我的做法是为较短的单元格设置一个 xib 文件,为较高的单元格设置一个 xib 文件(其中包含您在绘图中显示的所有内容)。我是这样做的,上面提到了两个 xib 文件:
#import "TableController.h"
#import "ShortCell.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:@"ShortCell" bundle:nil] forCellReuseIdentifier:@"ShortCell"];
[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 {
if (! [self.selectedPath isEqual:indexPath]) {
NSLog(@"returning short");
ShortCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ShortCell" forIndexPath:indexPath];
cell.label.text = self.theData[indexPath.row];
return cell;
}else{
NSLog(@"returning long");
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;
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
return;
}
NSIndexPath *lastSelectedPath = self.selectedPath;
self.selectedPath = indexPath;
if (lastSelectedPath != nil) {
[self.tableView reloadRowsAtIndexPaths:@[indexPath,lastSelectedPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}else{
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
在做了更多的研究之后,我发现了一种不同的方法来做一些你想做的事情,比如只使用一个细胞。在此方法中,您只有较高的单元格,但返回的高度只能让您看到单元格的上半部分,除非它被选中。你必须在你的细胞设计中做两件事来完成这项工作。首先在 IB 中选择“剪辑子视图”框,这样按钮就不会显示在它们的视图(单元格)之外。其次,进行约束,使按钮全部相互垂直排列,并为其中一个在单元格顶部的 UI 元素之一提供垂直间距约束。确保没有任何按钮对单元格底部有约束。通过这样做,按钮将与顶部元素保持固定距离(与单元格顶部应该有固定空间),当单元格较短时,这将导致它们被隐藏。要动画高度变化,您所要做的就是在表格视图上调用 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];
}
我认为,当您选择第一个单元格时,这会为您提供所需的动画,但是如果您随后选择当前所选单元格下方的单元格,则会得到一些不同的动画。我不知道有什么办法。