0

伊姆古尔

我想在选择时展开单元格以显示如上图所示的一行按钮。我有一个xib文件显示一个 320 宽 x 140 高的单元格。我已经把它分类了UITableViewCell。此外,我还有另一个xib文件,其中包含上图中以蓝色墨水显示的按钮行。

我可以使用一个非常聪明的人的initWithCoder答案来加载按钮行!

但是,它会覆盖 MyCustomCell 中的所有其他视图。

如何在单元格展开时加载 xib,使其位于 140pt 高单元格的下半部分?

4

2 回答 2

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];
    }
}
于 2013-04-14T05:10:01.783 回答
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];
}

我认为,当您选择第一个单元格时,这会为您提供所需的动画,但是如果您随后选择当前所选单元格下方的单元格,则会得到一些不同的动画。我不知道有什么办法。

于 2013-04-16T03:58:42.600 回答