我在 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:
我会将邓肯的答案标记为正确的答案,因为它为我指明了正确的方向,但我仍然对为什么/如何会出现这些症状感到困惑:
- 动画将帧移动到负偏移
目的地,然后将其动画回原点(而不是从
始发地到目的地)
- 运行一个空的动画 block ,但将另一个动画添加到第一个 block 的完成处理程序可以正确动画
尝试回答的信息:
- 我必须为项目使用自动布局,据我所知,我
无法为单个 View 禁用它
- 我没有在后台线程上放任何东西。我没有尝试专门分派(dispatch)到主线程,但我想我已经在那里了。不是所有可见的 UI 总是在主线程上吗?动画效果很好,只是不如预期。
- 我一开始没有走改变约束的路线的原因是我正在使用原型(prototype)单元,而 IB 不允许您从原型(prototype)单元创建 IBOutlets。遍历一个约束列表并检测一个特定的约束列表需要做一些工作,所以我将约束留空并尝试为框架设置动画(正如我所说,它在本周早些时候工作——并且在从动画 block 的完成处理程序)。
所以最终的解决方案是给容器单元格添加约束(这里重要的是前导),然后要制作动画,我必须找到约束:
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 (并且健壮、可靠和稳定),但事实证明它需要大量的发现工作。
Best Answer-推荐答案 strong>
您是否错误地在 Storyboard 或 XIB 中设置了自动布局? (默认开启)。如果是这样,您需要关闭 AutoLayout 或为约束设置动画,而不是操作 View 的框架。
关于ios - UIView 动画返回原点,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/26571433/
|