我在 UITableViewCell 中有一个 UILabel。当用户点击单元格时,我正在尝试使标签向右移动。我有这个代码:
CGRect otherFrame = cellLabel.frame;
otherFrame.origin.x +=50;
[UIView animateWithDuration:1.0f animations:^{
cellLabel.frame = otherFrame;
}];
发生的奇怪事情是标签向左跳跃 50 像素并以动画方式返回其原点( Action 开始前的位置)。
实际上,我在本周早些时候进行了这项工作,并且没有遇到任何问题,并且在浏览了修订历史之后,我无法弄清楚我哪里出错了。我一定是错过了什么愚蠢的东西。
编辑: 根据 Jakub 的回答,我发现这是可行的:
[UIView animateWithDuration:0.01f animations:^{}
completion:^(BOOL finished)
{
CGRect otherFrame = cellLabel.frame;
otherFrame.origin.x += 50;
[UIView animateWithDuration:1.0f animations:^{
cellLabel.frame = otherFrame;
}];
}];
奇怪的是,如果我将所有逻辑移动到一个完成处理程序中,该处理程序在第一个完成后执行一个新动画(第一个实际上没有做任何事情),那么一切都会正确动画。这是 super hacky,我对此一点也不满意。
谁能想到什么会导致初始动画将帧移动到预期目标的负偏移量,只是将其动画回原点,以及为什么触发新动画作为空动画的完成处理程序会工作吗?
编辑 2:
我会将邓肯的答案标记为正确的答案,因为它为我指明了正确的方向,但我仍然对为什么/如何会出现这些症状感到困惑:
尝试回答的信息:
所以最终的解决方案是给容器单元格添加约束(这里重要的是前导),然后要制作动画,我必须找到约束:
NSLayoutConstraint *titleLeadingConstraint = nil;
for( NSLayoutConstraint *constraint in cellLabel.superview.constraints )
{
if( constraint.firstItem == cellLabel && constraint.firstAttribute == NSLayoutAttributeLeading )
{
titleLeadingConstraint = constraint;
}
}
然后设置约束常量:
titleLeadingConstraint.constant = 55.0;
然后设置动画 block :
[UIView animateWithDuration:1.0f animations:^{
[self.view layoutIfNeeded];
}];
这个解决方案应该比移动框架更能证明 future (并且健壮、可靠和稳定),但事实证明它需要大量的发现工作。
您是否错误地在 Storyboard 或 XIB 中设置了自动布局? (默认开启)。如果是这样,您需要关闭 AutoLayout 或为约束设置动画,而不是操作 View 的框架。
关于ios - UIView 动画返回原点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571433/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |