展开单元格以显示nib文件视图

时间:2013-04-13 22:31:18

标签: iphone ios

Imgur

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

我可以使用此from a really smart guy使用initWithCoder加载按钮行!

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

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

2 个答案:

答案 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];
}

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