自定义UITableViewCell编辑动画

4

我正在编写一个使用自定义UITableViewCells的自定义UITableView。许多开发人员发现,不幸的是,当表开始编辑时,内容(在我的情况下是UILabel)不会自动移动。因此,在UITableViewCell自定义子类中,这里是我编写的代码来处理它:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
   [super setEditing:editing animated:animated];

    if (animated) {
    [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        CGRect titleFrame = self.titleLabel.frame;

        if (editing) {
            [self.titleLabel setFrame:CGRectMake(15, titleFrame.origin.y, titleFrame.size.width, titleFrame.size.height)];
        } else {
            [self.titleLabel setFrame:CGRectMake(25, titleFrame.origin.y, titleFrame.size.width, titleFrame.size.height)];

        }
    }completion:nil];
}

很不幸,我似乎找不到正确的选项组合,因为我尝试过的所有组合都没有正常工作。在没有使用UIViewAnimationOptionBeginFromCurrentState的情况下,UILabel在开始动画之前会向左移动到最远处,这是不可取的。而没有UIViewAnimationOptionBeginFromCurrentState,UILabel执行动画很好,但最后会有一个小的橡皮筋效果。
有什么想法吗? 谢谢。
编辑: 我已经弄清楚发生了什么!不确定如何修复它,但现在我确切地知道问题是什么!
首先,我必须取消“使用自动布局”才能使单元格自动移动。
当不编辑时,标签的初始x值为25。当编辑时,如果动画在不移动标签的情况下生效,则将其移动到左侧附件项目的右侧25个点。第一行之所以说15:
    if (editing) {
            [self.titleLabel setFrame:CGRectMake(15 ...

因为25分的差距相当大,看起来不太对劲。因此,动画带有代码,将标签移动到25号位置,然后返回到15号位置,创造出这种橡皮筋效果。
为了解决这个问题,我尝试了各种方法,比如将[super setEditing:...]调用移动到代码下面,始终将该调用的animated参数设置为NO...等等,但都没有成功。解决方案是以某种方式使标签在比x值更短的距离上进行动画,或者(正如我最初尝试做的那样)创建本地动画,将其发送到特定的x值并让其保持在那里。
我的直觉告诉我,这是一个关于UITableView的setEditing调用的连锁反应的问题,其中contentView的动画(可能)是在我的代码块之前发生的,因此将标签移动,然后我的代码执行,将其移回。
注意:无论标签是否是contentView的子视图,都会出现这种行为。
2个回答

3
你在问题中没有展示它,但看起来你直接将titleLabel添加到了单元格中。
相反,应该将自定义内容添加到单元格的contentView中,并使用适当的调整大小掩码,在正常转换到编辑模式期间,它会自动调整大小,无需覆盖任何方法。这就是标准标签和图像视图的工作方式。内容视图会被调整大小以显示编辑附件,并且内容视图的子视图会自动调整大小。

0

尝试以下代码

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
   [super setEditing:editing animated:animated];

   [self beginUpdates];

    if (animated) {
    [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        CGRect titleFrame = self.titleLabel.frame;

        if (editing) {
            [self.titleLabel setFrame:CGRectMake(15, titleFrame.origin.y, titleFrame.size.width, titleFrame.size.height)];
        } else {
            [self.titleLabel setFrame:CGRectMake(25, titleFrame.origin.y, titleFrame.size.width, titleFrame.size.height)];

        }
    }completion:nil];

   [self endUpdates];

}

代码片段位于uitableviewcell自定义子类中,因此无法调用[self beginUpdates]或[self endUpdates];但是,在对tableview本身进行setEditing调用之前和之后进行了这些调用。 - user1869469

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接