【问题标题】:Is there a way to get a position (or center) state from a unfinished UIView animation?有没有办法从未完成的 UIView 动画中获取位置(或中心)状态?
【发布时间】: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 设置动画,那么它(以及所有当前状态更改)将不在您的控制范围内,并且只有在动画完成并在指定位置后才会“返回”给您的控制和可用性终点。它是否正确?任何见解将不胜感激。感谢您的宝贵时间。

【问题讨论】:

    标签: iphone objective-c cocoa-touch animation 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 或其他功能来做到这一点。到目前为止,我不做这样的事情的主要原因是动画的内置“曲线”,所以它们不会生涩。如果必须的话,我可以自己用代码来解决它,但我试图弄清楚如何使用内置框架来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2020-02-22
    • 2017-02-27
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多