1

此问题与以下问题相关:您可以在 UITableViewCell 上设置高度变化的动画吗?

我正在使用以下代码为该问题中解释的 UITableViewCell 的高度变化设置动画:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


    ProductCell *cell = (ProductCell *) [tableView cellForRowAtIndexPath:indexPath];

    // Deselect cell
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    // Toggle 'selected' state
    BOOL isSelected = ![self cellIsSelected:indexPath];


    // Store cell 'selected' state keyed on indexPath
    NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected];
    [self.selectedIndexes setObject:selectedIndex forKey:indexPath];


    if (isSelected) {

        cell.addButton.hidden = NO;

    }else {


        cell.addButton.hidden = YES;

   }

    // This is where magic happens...
    [self.theMenuListTableView beginUpdates];

    [self.theMenuListTableView endUpdates];

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // If our cell is selected, return double height
    if([self cellIsSelected:indexPath]) {
        return kCellHeight * 2.0;
    }

    // Cell isn't selected so return single height
    return kCellHeight;
}

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath {

    NSNumber *selectedIndex = [self.selectedIndexes objectForKey:indexPath];
    return selectedIndex == nil ? FALSE : [selectedIndex boolValue];
}

这工作正常,但我想要的是,当单击一个单元格并且高度已设置动画,然后单击另一个单元格时,我希望第一个单元格收缩/折叠到它的原始大小,另一个展开(动画高度变化)。我怎样才能做到这一点?

4

3 回答 3

1

当您选择一个单元格并对其进行动画处理时,请存储该单元格的 indexPath。当您单击另一个单元格时,请检查它是同一个单元格还是 indexPath 不同。编写一个方法来制作其他动画。如果您有一个已存储的 indexPath,则为具有该已存储 indexPath 的单元格调用该新方法。我希望它有所帮助。

于 2013-09-17T15:24:20.370 回答
1

也许这有帮助:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
    cell.selectionStyle = UITableViewCellEditingStyleNone;
    return cell;
}

- (int) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];

    if (indexPath.row > 0) {
        NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
        [tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // If our cell is selected, return double height
    if([self cellIsSelected:indexPath]) {
        return 40 * 2.0;
    }

    // Cell isn't selected so return single height
    return 40;
}

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath {
    return (tblView.indexPathForSelectedRow.row == indexPath.row);
}
于 2013-09-17T15:25:17.713 回答
1

所以我猜你正在将选定的索引保存在 NSDictionary 对象中,并且为每个 indexPath 保存状态(选定/未选定)。您需要做的是只保存 1 个单元格的索引,即选定的一个。

所以,基本上需要以下改动:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


ProductCell *cell = (ProductCell *) [tableView cellForRowAtIndexPath:indexPath];

// Deselect cell
[tableView deselectRowAtIndexPath:indexPath animated:NO];

if (![indexPath isEqual:selectedIndex]) {

    cell.addButton.hidden = NO;

   // Store cell 'selected' state keyed on indexPath
   selectedIndex = indexPath;

}else {
    //Click deselecting cell
    selectedIndex = nil;

    cell.addButton.hidden = YES;

  }

// This is where magic happens...
[self.theMenuListTableView beginUpdates];

[self.theMenuListTableView endUpdates];

   }

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // If our cell is selected, return double height
    if(selectedIndex != nil && [selectedIndex isEqual:indexPath]) {
        return kCellHeight * 2.0;
    }

    // Cell isn't selected so return single height
    return kCellHeight;
}

//- (BOOL)cellIsSelected:(NSIndexPath *)indexPath {
//
//    NSNumber *selectedIndex = [self.selectedIndexes objectForKey:indexPath];
//    return selectedIndex == nil ? FALSE : [selectedIndex boolValue];
//}

并添加到控制器的 .h 文件中

@property NSIndexPath * selectedIndex;

和.m

@synthetize selectedIndex;

我可以检查这段代码是否运行,所以试试看它是否适合你。

于 2013-09-17T15:39:14.983 回答