我想在选中时展开单元格以显示一行按钮,如上图所示。我有一个xib
文件,显示一个320宽x 140高的单元格。我已将UITableViewCell
分类。另外,我还有另一个xib
文件,其中包含一排按钮,如上图中的蓝色墨水所示。
我可以使用此from a really smart guy使用initWithCoder
加载按钮行!
但是,它会覆盖MyCustomCell中的所有其他视图。
如何在单元格扩展时加载xib,使其位于140pt高单元格的下半部分?
答案 0 :(得分:0)
我不确定你的两个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];
}
}
答案 1 :(得分:0)
在做了一些研究之后,我发现了一种不同的方式来做一些像你想要的东西只使用一个细胞。在此方法中,您只有较高的单元格,但返回的高度只允许您查看单元格的上半部分,除非选中它。您需要在单元格的设计中执行两项操作才能使其工作。首先在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];
}
当我选择第一个单元格时,我认为这会为您提供所需的动画,但如果您在当前所选单元格下方选择一个单元格,则会得到稍微不同的动画。我不知道有什么方法。