我正在编写一个使用自定义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的子视图,都会出现这种行为。