【问题标题】:Detecting collision, during a CAKeyFrameAnimation在 CAKeyFrameAnimation 期间检测碰撞
【发布时间】:2012-05-03 12:41:36
【问题描述】:

是否可以在 CAKeyFrameAnimation 期间检测两个 UIImageView 的碰撞?

如果是这样,这是如何完成的,我尝试了多种方法,包括在动画期间检查 CGRect 是否存在碰撞 - 但找不到合适的方法在 CAKeyFrameAnimation 期间执行方法并尝试检测路径的碰撞和UIImageView。

【问题讨论】:

    标签: objective-c ios collision cgrect cgpath


    【解决方案1】:

    您需要从表示层获取属性。它将具有动画期间存在的信息的最佳近似值。通过

    访问它
    view.layer.presentationLayer
    

    查看 CALayer/presentationLayer 的文档了解更多详情。

    当您想要检查碰撞时,您可以获取每个对象的presentationLayer,然后访问您想要测试碰撞的任何属性。检查的确切方法取决于图层的类型,以及您是否想要简单的 hitTest-ing 或深度检查。只有您知道要查找的碰撞时间和类型。

    但是,要在动画制作时访问对象的属性,您需要presentationLayer。

    编辑

    您可以随时进行这些检查。您可以在另一个操作的上下文中执行此操作,或者使用 NSTimer 在某个时间间隔执行此操作。您甚至可以使用 CADisplayLink,它同时将您连接到动画计时器本身。

    如果您使用 CADisplayLink,我建议将 frameInterval 设置为尽可能高的值,并且仍然按照您的意愿进行操作,以免影响性能。

        timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(checkForCollisions)];
        // Callback is for every frame, which is 60 times per second.
        // Only callback every 6 frames (which is ten times per second)
        timer.frameInterval = 6;
        [timer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    

    完成后不要忘记使计时器无效。

    【讨论】:

    • 我想在动画发生时检查此属性或检查动画遵循的路径是否命中 UIImageView
    • 我已经告诉过你怎么做。随时检查对您来说重要的属性,但您必须在表示层中检查它们,因为这是唯一在动画发生时跟踪值的地方。
    • 在任何地方添加代码时,应用程序就会崩溃-我编写的代码是CGPoint center = [[weaponBullet.layer presentationLayer] center]; NSLog(@"%@", NSStringFromCGPoint(center));
    • 事实证明,对于任何有相同/类似问题的人来说,我应该得到框架属性,而不是中心
    • 请记住,您现在访问的是 CALayer,而不是 UIView。两者在对象层次结构中不相关。确保您作为 CALayer 正确访问它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多