2013-04-23 58 views
1

我正在用自定义UITableViewCells编写自定义UITableView。正如许多开发人员发现的,这种不幸的副作用是,当表开始编辑时,内容(在我的情况下为UILabel)不会自动移动。所以,这里是我写来对付它坐落在UITableViewCell的自定义子类代码:自定义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 ...,并且没有运气。解决方案是以某种方式使标签在比x值更短的距离内生成动画,或者(正如我原本试图做的那样)在本地创建动画以将其发送到特定的x值并使其停留在那里。

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

注意:无论标签是否为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]; 

} 
+0

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

3

您没有在问题出它,但它看起来像你直接将你的titleLabel到细胞。

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

相关问题