自定义 UITableViewCell 编辑动画

Posted

技术标签:

【中文标题】自定义 UITableViewCell 编辑动画【英文标题】:Custom UITableViewCell editing animation 【发布时间】:2013-04-23 17:17:10 【问题描述】:

我正在使用自定义 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:...] 调用移到代码下方,始终将该调用的动画参数设置为 NO...解决方案是以某种方式使标签在比 x 值更短的距离上进行动画处理,或者(正如我最初尝试做的那样)在本地创建动画以将其发送到特定的 x 值并让它保持在那里。

我的直觉告诉我,UITableView 发生的 [setEditing ] 调用的连锁反应是一个问题,其中 contentView 的动画(可能)发生在我的代码块之前,因此移动标签然后我的代码执行,将其移回。

注意:无论标签是否为 contentView 的子视图,都会发生该行为。

【问题讨论】:

【参考方案1】:

您没有在问题中显示它,但看起来您正在将 titleLabel 直接添加到单元格中。

改为将您的自定义内容添加到单元格的contentView,并使用适当的调整大小掩码,它会在正常转换到编辑模式期间为您调整大小,而无需覆盖任何方法。这就是标准标签和图像视图的工作方式。调整内容视图的大小以允许显示编辑附件,并且内容视图的子视图会自动调整大小。

【讨论】:

【参考方案2】:

试试下面的代码

- (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];


【讨论】:

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

以上是关于自定义 UITableViewCell 编辑动画的主要内容,如果未能解决你的问题,请参考以下文章

改变 UITableViewCell 高度的自定义动画

在 UITableViewCell 中为自定义 UIButton 设置动画

自定义 UITableViewCell 和 setSelected:animated 上的动画:

自定义 UITableViewCell 高度会产生不正确的动画

自定义 UITableViewCell 的 viewDidLayoutSubviews

UITableViewCell 自定义编辑视图