如何同时动画iOS中的单元格和表格变化?

时间:2015-01-21 05:44:32

标签: ios objective-c iphone uitableview

我正在尝试同时为自定义UITableViewCell和包含它的UITableView设置动画。

单击时,UITableViewCell的子视图会稍微重新排列,以便单元格的高度增加。我希望在单元格内的重新排列与该单元格的UITableView槽的大小调整同时发生,这样它就不会与它下面的单元格重叠。

再次点击时,反过来就会发生。

这是我到目前为止所尝试过的。

UITableView

单击UITableView时,我使用didSelectRowAtIndexPath更新selectedPath属性:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        if (self.selectedPath && indexPath.row == self.selectedPath.row) {
            self.selectedPath = nil;
        } else {
            self.selectedPath = indexPath;
        }
        [tableView reloadData];
    }

注意,它调用reloadData,它触发每个可见单元格重新获取原型并根据它是否被选中进行配置:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    QueueItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"QueueCell" forIndexPath:indexPath];
    [cell setImage:[UIImage imageNamed:[self.imageList objectAtIndex:indexPath.row]]];
    if (self.selectedPath && indexPath.row == self.selectedPath.row) {
        [cell makeSelected:YES];
    } else {
        [cell makeSelected:NO];
    }
    return cell;
}

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath {
    CGFloat height = 210;
    if (indexPath.row == [self.imageList count] - 1) {
        height += 10;
    }
    if (self.selectedPath && indexPath.row == self.selectedPath.row) {
        height += 35;
    }
    return height;
}

UITableViewCell子类

在自定义单元格类中,当动画被选中或未被选中时,会发生动画:

- (void)makeSelected:(BOOL)selected {
    if (selected) {
        [UIView animateWithDuration:0.5 animations:^{
            self.customImage.frame = CGRectMake(5, 5, 310, 210);
        }];
    } else {
        [UIView animateWithDuration:0.5 animations:^{
            self.customImage.frame = CGRectMake(10, 10, 300, 200);
        }];
    }
}

发生了什么

表格视图立即捕捉到单元格的新分配高度,然后单元格的内容慢慢动画到新状态。我希望这两件事能同时并顺利地发生。

3 个答案:

答案 0 :(得分:0)

您可能想要致电

[UIView animateWithDuration:0.5 animations:^{

    [self.tableView reloadData];

}];

并重新编写自定义单元格如下:

- (void)makeSelected:(BOOL)selected {
    if (selected) {
         self.customImage.frame = CGRectMake(5, 5, 310, 210);
    } else {
         self.customImage.frame = CGRectMake(10, 10, 300, 200);
    }
}

我希望它有所帮助。

答案 1 :(得分:0)

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

你需要重新加载特定的单元格,同时点按这样使用..

- (void)makeSelected:(BOOL)selected {
    if (selected) {
         self.customImage.frame = CGRectMake(5, 5, 310, 210);
    } else {
         self.customImage.frame = CGRectMake(10, 10, 300, 200);
    }
}

BOOl isSelect;声明为全球

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
            if (self.selectedPath && indexPath.row == self.selectedPath.row) {
               isSelect = NO;
            } else {
                self.selectedPath = indexPath;
                isSelect = YES;
            }
            [self.tableView beginUpdates];
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 
       }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    QueueItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"QueueCell" forIndexPath:indexPath];
    [cell setImage:[UIImage imageNamed:[self.imageList objectAtIndex:indexPath.row]]];
    if (self.selectedPath && indexPath.row == self.selectedPath.row && isSelect) {
        [cell makeSelected:YES];
    } else {
        [cell makeSelected:NO];
    }
    return cell;
}

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath {
    CGFloat height = 210;
    if (indexPath.row == [self.imageList count] - 1) {
        height += 10;
    }
    if (self.selectedPath && indexPath.row == self.selectedPath.row && isSelect) {
        height += 35;
    }
    return height;
}

它用动画重新加载单元格..我希望它会帮助你..现在你检查它会按你想要的那样工作......

答案 2 :(得分:0)

尝试这个......重新加载特定的细胞内容

NSIndexPath* indexPath1 = [NSIndexPath indexPathForRow:selectedRowIndexPath inSection:section];
// Add them in an index path array
NSArray* indexArray = [NSArray arrayWithObjects:indexPath1, nil];
// Launch reload for the two index path
[self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];