• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - UIView 动画返回原点

[复制链接]
菜鸟教程小白 发表于 2022-12-13 02:50:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在 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:

我会将邓肯的答案标记为正确的答案,因为它为我指明了正确的方向,但我仍然对为什么/如何会出现这些症状感到困惑:

  1. 动画将帧移动到负偏移 目的地,然后将其动画回原点(而不是从 始发地到目的地)
  2. 运行一个空的动画 block ,但将另一个动画添加到第一个 block 的完成处理程序可以正确动画

尝试回答的信息:

  1. 我必须为项目使用自动布局,据我所知,我 无法为单个 View 禁用它
  2. 我没有在后台线程上放任何东西。我没有尝试专门分派(dispatch)到主线程,但我想我已经在那里了。不是所有可见的 UI 总是在主线程上吗?动画效果很好,只是不如预期。
  3. 我一开始没有走改变约束的路线的原因是我正在使用原型(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-推荐答案


您是否错误地在 Storyboard 或 XIB 中设置了自动布局? (默认开启)。如果是这样,您需要关闭 AutoLayout 或为约束设置动画,而不是操作 View 的框架。

关于ios - UIView 动画返回原点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571433/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap