Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView动画位置跳跃_Ios_Uiviewanimation - Fatal编程技术网

Ios UIView动画位置跳跃

Ios UIView动画位置跳跃,ios,uiviewanimation,Ios,Uiviewanimation,我有一个过渡动画,在那里我需要使VC1上的一个项目在VC2滑动到位时移动到一个新位置。我在其他转换上没有问题,但是对于这个我有一个问题我无法理解 VC1-在中心有一个特定大小的图像 VC2-相同的图像以较小的尺寸放置在右上角 所以我需要移动和缩放,因为我是在过渡中这样做的,我认为正确的方法是: 从VC2获取图像,平移并缩放图像以匹配VC1上的图像(使用变换) 在VC1上隐藏图像 将图像从VC2动画化回.identity 当我把东西移到左上角时,我已经成功地做了同样的事情。然而,当我做这个特殊的动

我有一个过渡动画,在那里我需要使VC1上的一个项目在VC2滑动到位时移动到一个新位置。我在其他转换上没有问题,但是对于这个我有一个问题我无法理解

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

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

  • 从VC2获取图像,平移并缩放图像以匹配VC1上的图像(使用变换)
  • 在VC1上隐藏图像
  • 将图像从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)移动到(160180.5)。第二行显示我的数学是正确的。第三行显示创建的变换(缩放当前已关闭)。第四行显示动画开始前,我的图像位于正确的位置。最后两行在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)
    
    viewDidLoad
    视图将出现
    从:(x:336.0,y:35.5,w:38.0)转换为:(x:368.0,y:147.6667,w:66.0)
    X偏移量:32.0 Y偏移量:112.166667
    转换:CGAffineTransform(a:2.6667,b:0.0,c:0.0,d:2.6667,tx:32.0,ty:112.166667)
    预动画:(x:368.0,y:147.6667)
    动画块:(到.x:368.0,到.y:147.6667-(从.x:368.0,从.y:147.6667)
    ViewWillLayoutSubView
    viewDidLayoutSubviews
    当前位置:(midX:729.0,midY:127.666 7)
    
    以防万一,人们不想通过阅读文本墙来找到解决方案。问题是,在布局所有视图之前,我使用了不同视图控制器中的视图位置。我假设在动画逻辑开始之前,整个视图生命周期都在我的演示视图控制器中处理过,我是错

    动画调用顺序:

  • viewDidLoad
  • 视图将出现
  • 动画转换
  • ViewWillLayoutSubView
  • viewDidLayoutSubviews
  • 因此,修复方法是手动调用
    setNeedsLayout()
    layoutifneed()
    作为动画转换的开始,以便视图的位置都是已知的,并且可以用于转换