有没有办法从未完成的 UIView 动画中获取位置(或中心)状态?

Posted

技术标签:

【中文标题】有没有办法从未完成的 UIView 动画中获取位置(或中心)状态?【英文标题】:Is there a way to get a position (or center) state from a unfinished UIView animation? 【发布时间】:2010-01-26 06:30:02 【问题描述】:

我有一个 UIView 做一个简单的动画。它将 y 位置从 100 调整到 130,然后反转。我希望它继续重复,所以我将重复计数器设置为 999。根据用户输入,我想采用相同的 UIView 并调整 x 位置。这是通过另一个 UIView 动画完成的。问题是,当第二个动画开始时,第一个动画(在 y 方向上从 100 到 130)突然结束(正如我读到的那样)。有什么方法可以在 UIView 结束之前获取 y 坐标的最终位置?理想情况下,我希望 UIView 在平移 x 坐标时保持在相同的 y 位置。

总结:UIView 从 100-130 沿 y 方向移动,反转并重复,直到收到用户输入。一旦收到,动画就会被剪短,UIView 会跳转到 y=130。我想要一种方法来找出动画被缩短之前最终的 y 值是多少,所以当使用带有 x 平移的新动画时,UIView 不会跳转到 130,而是保持第一次时的相同位置动画结束。

我似乎看不到任何可以让你这样做的东西。在我看来,一旦您使用 UIView 设置动画,那么它(以及所有当前状态更改)将不在您的控制范围内,并且只有在动画完成并在指定位置后才会“返回”给您的控制和可用性终点。它是否正确?任何见解将不胜感激。感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

您正在寻找“表示层”。

每个 UIView 都使用 Core Animation 层进行渲染,该层可通过 UIView 的 layer 属性访问。

CALayer 有一个 presentationLayer 方法,该方法返回一个 CALayer,表示“与当前显示的图层版本非常接近”。

所以,要获取视图的当前位置:

CGRect currentViewFrame = [[myView.layer presentationLayer] frame];

【讨论】:

我最终在 UI Builder 中作为父级创建了一个新的 UIView,并将我的项目作为子级放在了那里。然后,我在用户输入时将父 UIView 层沿 x 方向移动,这使子项在移动时继续在父项顶部的 y 方向上运行。虽然我没有实施您的答案,但它似乎直接回答了我提出的问题,所以我暂时将其标记为已回答。【参考方案2】:

我不确定这是否正是你想要的,但在 beginAnimations 块中使用 UIView 的 setAnimationBeginsFromCurrentState: 会导致 x 动画在 y 正在进行的任何地方开始。

【讨论】:

我现在正在阅读它。理想情况下,我不想停止我的 y 方向动画,只在用户输入时引入基于 x 的动画。 我没用过这个,所以不知道会不会杀掉另一个,但是值得一试。如果它确实杀死了它,你可以让新的动画块也包含 y 动画。 问题似乎是,一旦我开始 y 动画,它会立即在末尾 (130) 列出 y 变量,即使它在那段时间来回设置动画也是如此。关于如何实现 setAnimationBeginsFromCurrentState 并没有太多内容。似乎允许 y 在进入 x 动画时保持不变,但我不能只传入新的 x 坐标,我必须传入一个 CGPoint,包括我只能访问最终 y 的 y 组件位置(这也杀死了 y 组件的动画部分)。【参考方案3】:

也许对于您要完成的工作,对动画进行更多控制会有所帮助。对于这个任务,我建议使用 NSTimer 安排在最适合您的任何时间间隔(1/30 到 1/60),并在每次计时器触发时调整 UIView 位置。这样您就可以随时访问视图位置的 X 和 Y 分量。

类似:

- (void)timerFired:(NSTimer *)timer 
    CGPoint p = view.center;

    if (p.y >= 130.0) 
        positiveMovement = NO;
    
    else if (p.y <= 100.0) 
        positiveMovement = YES;
    

    if (positiveMovement)
        p.y++;
    else
        p.y--;

    view.center = p;

positiveMovement 只是一个 BOOL 实例变量。然后,您也可以使用用户输入直接调整视图位置的 X 值,它会相应地更新。

【讨论】:

这是我最初考虑的,但我正在尝试使用内置的 UIView 或其他功能来做到这一点。到目前为止,我不做这样的事情的主要原因是动画的内置“曲线”,所以它们不会生涩。如果必须的话,我可以自己用代码来解决它,但我试图弄清楚如何使用内置框架来做到这一点。

以上是关于有没有办法从未完成的 UIView 动画中获取位置(或中心)状态?的主要内容,如果未能解决你的问题,请参考以下文章

减慢动画中的 UIView 动画

有没有办法通过自定义缓动方程使用 UIView 动画

UIView 动画在第一次尝试时没有动画

有没有办法在 collectionview 中获取 scrollIndicator 的位置?

iOS 中有没有办法在 UIView 中录制动画绘图?

UIVIew/CALayer 动画期间的回调