-1

異なるHeightの Custom Cell A & B があるとします。
カスタム セル A は、UITableView にデフォルトで読み込まれます。ユーザーがセル Aを選択すると、そのセルが削除され、セル Bがその位置に追加されます。逆もまた同様です。アコーディオン風にリサイズのアニメーションをしてくれます。

4

3 に答える 3

5

これを行うには、データ配列にプロパティ (辞書を使用している場合はキー) を設定して、各 indexPath で必要なセルを追跡し、cellFroRowAtIndexPath で if-else ステートメントを使用して正しいセルをデキューする必要があります。didSelectRowAtIndexPath では、そのプロパティを確認し、反対のプロパティに設定してから、テーブルをリロードします。また、heightForRowAtIndexPath を実装し、同じプロパティをチェックして、返す高さを決定する必要があります。

編集後:

選択した 1 つのセルだけを追跡する必要がある場合は、その値を保持するプロパティ (selectedPath と呼びます) を作成し、heightForRowAtIndexPath と cellForRowAtIndexPath で確認します。ストーリーボードに 2 つのセルを作成しました。1 つはシンプルな UITableViewCell で、もう 1 つはクラス RDCell のカスタム セルです。これで目的のアニメーションが得られるかどうかはわかりませんが、試してみて、近いかどうかを確認してください。

#import "TableController.h"
#import "RDCell.h"

@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@property (nonatomic) NSIndexPath *selectedPath;
@end

@implementation TableController 


- (void)viewDidLoad {
    [super viewDidLoad];
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight"];
    self.selectedPath = [NSIndexPath indexPathForRow:-1 inSection:0];
    [self.tableView reloadData];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.theData.count;
}


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([self.selectedPath isEqual:indexPath]) {
        return 90;
    }else{
        return 44;
    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if ([self.selectedPath isEqual:indexPath]) {
        RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RDCell" forIndexPath:indexPath];
        cell.label.text = self.theData[indexPath.row];
        return cell;

    }else{
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
        cell.textLabel.text = self.theData[indexPath.row];
        return cell;
    }
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSIndexPath *oldPath = self.selectedPath;
    self.selectedPath = indexPath;
    [self.tableView reloadRowsAtIndexPaths:@[indexPath,oldPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
于 2013-08-25T05:57:23.497 に答える
2
 **Got this amazing Solution, its working great...**






 @implementation NetworkCentreTable
    {
        NSMutableArray *arr;
        BOOL chk;
        int onSelectCount;
        NSIndexPath *onSelectTrack;
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        arr=[[NSMutableArray alloc] initWithObjects:@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",nil];
        onSelectCount=0;
        static NSString *CellIdentifier1 = @"NetworkCell2";
        UINib *nib = [UINib nibWithNibName:@"NetworkCentreCellBig" bundle:nil];
        [self.tblNetworkCentre registerNib:nib forCellReuseIdentifier:CellIdentifier1]; 
    }

    #pragma mark -
    #pragma mark Custom Network TableView delegate and Datasource

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return [arr count];
    }

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }


    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{


        static NSString *CellIdentifier1 = @"NetworkCentreCell";
        static NSString *CellIdentifier2 = @"NetworkCentreCellBig";


        if(self.selectedRowIndex && indexPath.row == self.selectedRowIndex.integerValue)

        {
            NetworkCentreCell *cell = (NetworkCentreCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
            UIViewController *controller=[[UIViewController alloc] initWithNibName:CellIdentifier2 bundle:nil];
            cell=(NetworkCentreCell *)controller.view;
            return cell;
        }
        else
        {
            NetworkCentreCell *cell = (NetworkCentreCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            UIViewController *controller=[[UIViewController alloc] initWithNibName:CellIdentifier1 bundle:nil];
            cell=(NetworkCentreCell *)controller.view;
            return cell;

        }


    }

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        onSelectCount++;
        NSLog(@"num=%d",onSelectCount);
        self.selectedIndexPath = indexPath;
        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationNone];
        self.selectedRowIndex = [NSNumber numberWithInteger:indexPath.row]; 
        [self.tblNetworkCentre deselectRowAtIndexPath:indexPath animated:YES];

        //First we check if a cell is already expanded.
        //If it is we want to minimize make sure it is reloaded to minimize it back
       if( onSelectCount==1 )
        {
             [tableView beginUpdates];
            NSIndexPath *previousPath = [NSIndexPath indexPathForRow:self.selectedRowIndex.integerValue inSection:0];
            self.selectedRowIndex = [NSNumber numberWithInteger:indexPath.row];
            onSelectTrack=indexPath;
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:previousPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView endUpdates];

        }
       if(onSelectTrack.row!=indexPath.row)
       {
           [tableView beginUpdates];
           [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:onSelectTrack] withRowAnimation:UITableViewRowAnimationFade];
            [tableView endUpdates];

           onSelectTrack=indexPath;
           onSelectCount=0;
           [self tableView:tableView didSelectRowAtIndexPath:onSelectTrack];

       }

        if(self.selectedRowIndex.integerValue == indexPath.row && onSelectCount==2)
            {
             [tableView beginUpdates];
            self.selectedRowIndex = [NSNumber numberWithInteger:-1];
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            onSelectCount=0;
            [tableView endUpdates];

        }


    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {


       if(self.selectedRowIndex && indexPath.row == self.selectedRowIndex.integerValue)

        {

            return 280;
        }else{
            return 85;
        }


    }
于 2013-08-27T06:51:23.870 に答える
1

didSelectRowAtIndexPath メソッドで [yourTableview reloadData] を呼び出すことができます。次に、numberOfRowsInSection で新しいカウントを指定します。heightForRowAtIndexpath で、カスタムの高さを指定します。cellForRowAtIndexpath にカスタム セルを追加します。

于 2013-08-25T03:33:05.460 に答える