【问题标题】:UIView animated position jumpingUIView 动画位置跳跃
【发布时间】:2017-02-06 18:33:59
【问题描述】:

我有一个过渡动画,当 VC2 滑动到位时,我需要让它看起来 VC1 上的项目移动到新位置。我在其他过渡上进行这项工作没有任何问题,但对于这个我有一个我无法弄清楚的问题。

VC1 - 在中心有一个特定尺寸的图像 VC2 - 相同的图像以较小的尺寸放置在右上角

所以我需要移动和扩展,因为我是在过渡中这样做的,所以我认为正确的做法是:

  1. 从 VC2 获取图像并转换并缩放以匹配 VC1 上的图像(使用变换)
  2. 在 VC1 上隐藏图片
  3. 将图像从 VC2 动画化回 .identity

在将某些内容移动到左上角时,我已经成功地完成了完全相同的操作。然而,当我做这个特定的动画时,我看到我的 VC2 图像随着动画开始跳到一个新位置。我只在使用大于或小于 iPhone7 的设备/模拟器时才会看到这种跳跃,并且它会根据屏幕宽度(左为更小,右为更大)不同地跳跃。

我已经在所有阶段注销了我的图像位置:

transform from: (x:336.0, y:35.5, w:38.0) to: (x:160.0, y:180.5, w:66.0)
xOffset: -176.0 yOffset: 145.0
transform: CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: -176.0, ty: 145.0)
preanimation: (x: 160.0, y: 180.5
currentPosition: (midX: 105.0, midY: 180.5)
currentPosition: (midX: 112.312, midY: 174.476)

此日志的第一行显示我正在将图像从 (336, 35) 移动到 (160, 180.5)。第二行表明我的数学是正确的。第三行显示了创建的变换(缩放当前关闭)。第四行显示我的图像在动画开始之前位于正确的位置。最后 2 行在 cadisplaylink 回调中返回,显示我的位置在动画开始之前跳跃。

有没有人遇到过这样的事情?有什么线索可以解决这个问题吗?我的图像都使用 LayoutConstraints 放置,我的动画都使用变换运行(在动画之前变换然后动画回 .identity)。

编辑: 一些补充信息,当我从横向开始时,我注意到我的原始帧完全错误:

transform from: (x:336.0, y:35.5, w:38.0) to: (x:368.0, y:147.666666666667, w:66.0)
xOffset: 32.0 yOffset: 112.166666666667
transform: CGAffineTransform(a: 2.66666666666667, b: 0.0, c: 0.0, d: 2.66666666666667, tx: 32.0, ty: 112.166666666667)
preanimation: (x: 368.0, y: 147.666666666667
currentPosition: (midX: 729.0, midY: 127.666666666667)

因此,此时我认为问题在于,由于自动布局约束,我尝试同步的帧在动画之前不正确。并且当动画开始时,动画使用布局约束重新计算所有帧,然后应用我的变换使跳转出现。

EDIT2:

我想我已经弄明白了。问题是我正在制作动画的视图尚未布置它的子视图,因此框架已关闭。通过在动画设置期间在我的视图上调用.setNeedsLayout().layoutIfNeeded(),我可以获得正确的动画位置。

如果好奇,这里是我第一次编辑时的相同日志,并添加了调用 viewlifecycle 方法的时间:

viewDidLoad <Chalkboard.SwipeToMoveViewController: 0x7fb1f760fb70>
viewWillAppear <Chalkboard.SwipeToMoveViewController: 0x7fb1f760fb70>
transform from: (x:336.0, y:35.5, w:38.0) to: (x:368.0, y:147.666666666667, w:66.0)
xOffset: 32.0 yOffset: 112.166666666667
transform: CGAffineTransform(a: 2.66666666666667, b: 0.0, c: 0.0, d: 2.66666666666667, tx: 32.0, ty: 112.166666666667)
preanimation: (x: 368.0, y: 147.666666666667
animation Block: (to.x: 368.0, to.y: 147.666666666667 - (from.x: 368.0, from.y: 147.666666666667
viewWillLayoutSubviews <Chalkboard.SwipeToMoveViewController: 0x7fb1f760fb70>
viewDidLayoutSubviews <Chalkboard.SwipeToMoveViewController: 0x7fb1f760fb70>
currentPosition: (midX: 729.0, midY: 127.666666666667)

【问题讨论】:

    标签: ios uiviewanimation


    【解决方案1】:

    以防人们不想通读文本墙来找到解决方案,问题是我在所有视图布局之前使用了不同视图控制器中的视图位置。我假设在动画逻辑开始之前,我的呈现视图控制器已经处理了整个视图生命周期,我错了。

    动画调用顺序:

    1. viewDidLoad
    2. viewWillAppear
    3. 动画过渡
    4. viewWillLayoutSubviews
    5. viewDidLayoutSubviews

    因此解决方法是手动调用 setNeedsLayout()layoutIfNeeded() 作为我的 animateTransition 的开始,以便我的视图的位置都是已知的并且可以用于转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多