自定义UITableViewCell编辑动画

时间:2013-04-23 17:17:11

标签: ios objective-c xcode uitableview uiviewanimation

我正在使用自定义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可以很好地执行动画,但最后会产生一个小的橡皮筋效果。
关于发生了什么的任何想法? 感谢。

修改: 我知道发生了什么事!不确定如何解决它,但现在我现在正是问题所在!

首先,我必须取消选中'使用Autolayout'才能让单元格自动移动。

不编辑时标签初始x值为25。编辑时,如果动画在不自行移动标签的情况下生效,则会移动到左侧附件项目右侧的25个点。第一行的原因是15:

    if (editing) {
            [self.titleLabel setFrame:CGRectMake(15 ...

是因为25点差距相当宽,看起来不对。因此,代码就位的动画会将标签移动到25标记,然后再移回15标记,从而创建橡皮筋效果。

在尝试解决这个问题时,我尝试了各种各样的事情,例如在代码下方移动[super setEditing:...]调用,始终将该调用的动画参数设置为NO ... on and on and no luck 。解决方案是以某种方式使标签在比x值更短的距离上制作动画,或者(正如我最初尝试的那样)在本地创建动画以将其发送到特定的x值并使其保持在那里。

我的直觉告诉我,[setEditing ]调用的链式反应是一个问题,UITableView发生在我的代码块之前发生contentView(可能)动画的{{1}},从而移动了标签然后我的代码执行,将其移回。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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];

}