13

我想知道我缺少什么,因为隐藏删除按钮时我的单元格没有动画。在删除按钮完成动画之前,标签会跳回原始位置。

当我点击圆形编辑视图以显示删除按钮时,标签动画起作用:

出现删除按钮的单元格屏幕截图

但是,当我再次点击它以隐藏删除按钮时,标签的移动没有​​动画:

删除按钮消失的单元格屏幕截图

注意:这些屏幕截图不是从以下代码创建的。但他们显示了问题。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    homeCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[homeCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Set up the cell
    Consumed *drinkObj = [self.appDelegate.consumedDrinksArray objectAtIndex:indexPath.row];        
    cell.titleLabel.text = drinkObj.drinkName;
    NSString *detailTextTime = [NSDate stringFromDate:drinkObj.dateConsumed withFormat:@"h:mma"];

    NSString *detailTextrelative = [relativeDateTransformer transformedValue:drinkObj.dateConsumed];

    NSString *detailText =  [NSString stringWithFormat:@"%@ %@ ", detailTextTime,detailTextrelative];
    cell.timeLabel.text = detailText;

    cell.stdDLabel.text = @"999.0"; //[NSString stringWithFormat:@"%@", drinkObj.standardDrinks];
    cell.stdDLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
    cell.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
    cell.timeLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}
4

4 回答 4

7

编辑:我看到这个错误与我最初理解的不同。让我们更正我的答案。如果我是对的,您的删除按钮会随着动画正确消失,但内容视图会在没有动画的情况下自行调整大小(在按钮动画后面)。

在这种情况下,您必须自己管理动画。假设你不支持旋转,我给你代码。如果你想支持旋转,你需要更多的代码:-)

这是一个示例项目(代码很多,因为我使用了标准的主从 xcode 模板,只看自定义单元格):示例项目

要将其应用于您的代码:

首先,将单元格右侧标签的自动调整大小掩码更改为锚定在左侧。

我不确定正确的标签是否是 stdDLabel,我会假设它

// if the right margin is flexible, the left-top-bottom are fixed
cell.stdDLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;

在您的单元格子类中覆盖这样的setEditing:animated:方法:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    // this is an array of the labels / view that you want to animate
    NSArray *objectsToMove = @[self.stdDLabel];
    // this is the amount of pixel to move - the width of the delete button
    float pixelToMove = 70.0f;

    float animationDuration = 0.3f;

    // calculating the delta. If set editing, move from right to left. otherwise, from left to right
    float delta = (editing) ? -pixelToMove : pixelToMove;

    // put the move code in a block for avoid repeating code in the if
    void (^moveBlock)() = ^{
        for (UIView *view in objectsToMove) {
            view.center = CGPointMake(view.center.x + delta, view.center.y);
        }
    };

    // we want to move the labels only if editing is different from the current isEditing state
    if (editing != self.isEditing)
    {
        // execute the move block, animated or not
        if (animated)
            [UIView animateWithDuration:animationDuration animations:moveBlock];
        else
            moveBlock();
    }

    // call the super implementation
    [super setEditing:editing animated:animated];
}
于 2013-05-08T09:41:29.560 回答
3

我没有检查您的所有代码,但可以肯定的是,您需要在删除的每一侧添加开始/结束更新...

[self.drinksTableView beginUpdates];
[self.drinksTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.drinksTableView endUpdates];

...获取动画​​。

于 2012-09-07T03:01:15.013 回答
3

您可以使用手势识别器执行此任务。它可以帮助您管理您的单元格。还可以在单​​元格上添加一个自定义删除按钮,而不是默认的删除按钮。

于 2013-05-06T13:28:37.653 回答
2

tableView:didEndEditingRowAtIndexPath:执行通过设置它们的框架手动重新定位 UILabel 的任务

- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    homeCell *cell = (homeCell *)[tableView cellForRowAtIndexpath:indexPath];

    UILabel *labelToBeRelocated = (UILabel *)[cell viewWithTag:YOUR_LABEL_TAG];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.25f];

    [labelToBeRelocated setFrame:CGRectMake(New_PosX , New_PosY , width , height)];

    [UIView commitAnimations];
}

由于上述委托方法是在 UITableViewCell 中隐藏 EditingButton(删除按钮)后调用的,因此 UILabel 只有在删除按钮被隐藏后才会重新定位其位置。希望它会帮助你。

于 2013-05-06T13:50:30.243 回答